如何在C#中序列化递归字典?

问题描述 投票:0回答:1

下面的类是递归字典(树状结构)。

EntitiyID
只是
string
的别名,必须通过
HierarchicalRelationshipsMap.EntityID
访问。

public class HierarchicalRelationshipsMap: Dictionary<HierarchicalRelationshipsMap.EntityID, HierarchicalRelationshipsMap>
{

  public class EntityID
  {
    public static implicit operator EntityID(string value) => new EntityID();
    public static implicit operator string(EntityID entityID) => string.Empty;
  }

}

实例示例:

HierarchicalRelationshipsMap hierarchicalRelationshipsMap = new()
{
  {
    Guid.NewGuid().ToString(),
    new HierarchicalRelationshipsMap
    {
      {Guid.NewGuid().ToString(), new HierarchicalRelationshipsMap() },
      {Guid.NewGuid().ToString(), new HierarchicalRelationshipsMap() }
    }
  }
};

如果用

Newtonsoft.Json.JsonConvert.SerializeObject(hierarchicalRelationshipsMap, Newtonsoft.Json.Formatting.Indented));
序列化的话,会是:

{
  "MockDataSource.HierarchicalRelationshipsMap+EntityID": {
    "MockDataSource.HierarchicalRelationshipsMap+EntityID": {},
    "MockDataSource.HierarchicalRelationshipsMap+EntityID": {}
  }
}

虽然低于预期。

{
  "2ca15c6b-e706-4f1c-b287-1629ed0bac0a": {
     "21333569-4248-49ac-ba0c-d1612a2c42a8": {}
     "fc7ad745-8890-4a68-9431-c8de4801470b": {}
  }
}

如何解决这个问题?

c# json .net jsonserializer json-serialization
1个回答
0
投票

问题源于

JsonConvert
解释
EntityID
的方式。由于它是一个类,Json.NET 不应用隐式运算符,而是序列化实际的类型名称。要解决这个问题,只需在
ToString()
中添加
EntityID
的实现并使其返回 GUID 表示形式即可。您还可以为该类实现自定义转换器并使用它。

© www.soinside.com 2019 - 2024. All rights reserved.