下面的类是递归字典(树状结构)。
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": {}
}
}
如何解决这个问题?
问题源于
JsonConvert
解释EntityID
的方式。由于它是一个类,Json.NET 不应用隐式运算符,而是序列化实际的类型名称。要解决这个问题,只需在 ToString()
中添加 EntityID
的实现并使其返回 GUID 表示形式即可。您还可以为该类实现自定义转换器并使用它。