C# 仅存储某些属性的类型

C# 仅存储某些属性的类型,c#,interface,json.net,C#,Interface,Json.net,我有一个非常深的树,节点如下: var json = JsonConvert.SerializeObject(tree); 类节点{ 公共字符串名称{get;} 公共IA A{get;set;} 公共IReadOnlyList子项{get;} [JsonConstructor] 公共节点(字符串名称,列表子节点){…} } 我试图减少存储序列化数据所需的空间量 我希望序列化程序能够找出子类的类型,因为构造函数中有相应的参数。是否可以仅存储属性A的类型,而不存储子项的类型 目前,我使用以下设备

我有一个非常深的树,节点如下:

var json = JsonConvert.SerializeObject(tree);
类节点{
公共字符串名称{get;}
公共IA A{get;set;}
公共IReadOnlyList子项{get;}
[JsonConstructor]
公共节点(字符串名称,列表子节点){…}
}
我试图减少存储序列化数据所需的空间量

我希望序列化程序能够找出
子类的类型,因为构造函数中有相应的参数。是否可以仅存储属性
A
的类型,而不存储
子项的类型

目前,我使用以下设备,但这在空间上非常昂贵:

JsonConvert.SerializeObject(树,新的JsonSerializerSettings{TypeNameHandling=TypeNameHandling.Auto});
它将
子项
序列化为

“子项”:{
“$type”:“System.Collections.Generic.List`1[[Very.Long.Node,Very.Long.Structure]],mscorlib”,
...

真正的类型非常复杂,因此每个字段的解决方案将非常有用。

尝试将
[JsonProperty]
属性添加到
a
属性,并在那里设置
typenameholling
。然后从
JsonSerializerSettings
中删除
typenameholling
(如果不需要任何其他设置,也可以完全省略
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) { ... }
}

这里是一个往返演示:

我不知道JSON.Net是否支持这一点,但一个解决方案可能是复制您的树,只包括要序列化的子树,执行序列化,并将复制的树释放到以太。