gpt4 book ai didi

c# - Newtonsoft JSON.NET 创建类型字典

转载 作者:太空宇宙 更新时间:2023-11-03 22:40:20 25 4
gpt4 key购买 nike

我有一些基于 Newtonsoft Json.NET 包的序列化代码。
我序列化了几种类型的大量实例,但是 JSON.NET 添加一个标签,例如"$type": "complex_serializer_tests.SerializerTests+Node, complex-serializer-tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", 每个元素。

这会显着增加保存格式的大小,我想消除它。

我想创建一个类型字典,它将:
1. 为每个新类型分配一个 Id(整数)2. 并沿着 "$type":#105
行在 JSON 中使用它同时添加一个 type-id => type-name 元素。

对不起,这不是很具体,
但问题是我不知道如何解决它,希望得到一些指导,我应该阅读哪些主题...

编辑 澄清一下,我不介意 $type 属性名称,但它是内容...而不是编写程序集全限定名,我想要一个代表它的索引。

谢谢

最佳答案

您可以使用自定义 Serialization Binder 定义自定义类型.

即.

public class MyBinder : ISerializationBinder
{
public Dictionary<string,Type> Types { get; set; }

public Type BindToType(string assemblyName, string typeName)
{
// probably want to add some error handling here
return Types[typeName];
}

public void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
assemblyName = null;
// not very efficient, but could have a separate reverse dictionary
typeName= Types.First(t => t.Value == serializedType).Value;
}
}

var settings = new JsonSerializerSettings { SerializationBinder = new MyBinder { ... } };

另外,如果它在可以推断的地方添加类型名称,您可以在 JsonSerializerSettings 中指定何时添加它们,尽管这可能会影响反序列化,具体取决于您要反序列化的类型。

var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.None };
JsonConvert.SerializeObject(obj, settings);

关于c# - Newtonsoft JSON.NET 创建类型字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52537247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com