仅针对某些属性的商店类型

时间:2020-09-02 22:27:20

标签: c# interface json.net

我有一棵很深的树,上面有这样的节点:

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",
  ...

实际类型非常复杂,因此非常感谢每字段解决方案。

1 个答案:

答案 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);

这是往返演示:https://dotnetfiddle.net/c8LvTi