我有一棵很深的树,上面有这样的节点:
class Node {
public string Name { get; }
public IA A { get; set; }
public IReadOnlyList<Node> Children { get; }
[JsonConstructor]
public Node(string name, List<Node> children) { ... }
}
我正在尝试减少存储序列化数据所需的空间。
由于构造函数中的相应参数,我希望序列化程序可能能够找出Children
的类型。
A
存储类型,而不能为Children
存储类型?
现在我使用以下内容,但是在空间方面这是非常昂贵的:
JsonConvert.SerializeObject(tree, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
它将Children
序列化为
"Children": {
"$type": "System.Collections.Generic.List`1[[Very.Long.Node, Very.Long.Structure]], mscorlib",
...
实际类型非常复杂,因此非常感谢每字段解决方案。
答案 0 :(得分:1)
尝试将[JsonProperty]
属性添加到A
属性,然后在此处设置TypeNameHandling
。然后从TypeNameHandling
中删除JsonSerializerSettings
(或者,如果不需要其他设置,则完全省略JsonSerializerSettings
)。
换句话说:
class Node {
public string Name { get; }
[JsonProperty(TypeNameHandling = TypeNameHandling.Auto)] // add this
public IA A { get; set; }
public IReadOnlyList<Node> Children { get; }
[JsonConstructor]
public Node(string name, List<Node> children) { ... }
}
然后像这样序列化:
var json = JsonConvert.SerializeObject(tree);