只要我沒有只有數據結構中的具體類型我反序列化一個巨大的json樹結構,它開始使用大量的內存,但是當反序列化到完全具體的類型時,它的內存佔用會保持相對較小...有沒有一個優雅的解決方法呢?Json.Net - 基於接口的數據結構的高性能反序列化?
我得到的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'代碼嗎? –
dbc