【发布时间】:2017-07-03 09:02:33
【问题描述】:
只要我在数据结构中没有 only 具体类型,我将一个巨大的 json 树结构反序列化为,它开始使用大量内存,但它的内存占用量保持相对较小反序列化为完全具体的类型……有没有一个优雅的解决方法?
我得到的 json 是在其他地方生成的,所以我对得到它的格式没有影响(它是一个树结构,如果它直接序列化为 json,类似于下面的代码示例),并且在最坏的情况下大约250-300MB。 我用来映射它的数据结构看起来有点像下面的例子(虽然在某些地方是结构)
public class Node : INode
{
[JsonConverter(typeof(NodeTypeConverter<IInnerNode, InnerNodeType1>))]
public List<INodeInner> InnerNodes { get; set; }
}
public class InnerNodeNodeType1 : INode
{
[JsonConverter(typeof(NodeTypeConverter<IInnerNode, InnerNodeType2>))]
public List<INodeInner> InnerNodes { get; set; }
// some other properties
}
public class InnerNodeNodeType2 : INode
{
[JsonConverter(typeof(NodeTypeConverter<IInnerNode, InnerNodeType3>))]
public List<INodeInner> InnerNodes { get; set; }
// some even different properties
}
…
然而,我没有找到一种方法来映射它而不让它运行的 PC 跪下,特别是内存方面(除此之外,在某些地方 List<interface> 我什至没有得到 json.Net要使用转换器,它甚至在检查转换器类之前就抛出了错误Could not create an instance of type {type}. Type is an interface or abstract class and cannot be instantiated....)。
所以现在,我将其更改为所有具体类型/具体类型实例的列表,而不是接口和转换器,并且它运行时内存占用少得多(数量级!)。但这并不优雅,因为这样一来,我就不能将大多数类重用于不同种类的树,而我将不得不在程序的其他地方使用这些树,它们相似,但略有不同。
有没有一个优雅的解决方案?
PS:感谢您阅读本文!这个问题可能没有完美地提出和/或包含您可能需要提出解决方案的所有和任何类型的信息。然而,我发现,每当我试图涵盖所有基础并预测所有进一步的问题时,我都没有得到任何回应根本,所以这一次我试图提出不同的问题......:P
【问题讨论】:
-
你能分享一下
NodeTypeConverter<TInterface, TConcrete>的代码吗?
标签: c# json interface tree json.net