Json.NET vs Newtonsoft.Json SerializationBinder是不同的



我知道这个话题有很多类似的问题,但我没有在这里找到答案。

我已经下载了 Unity 中的Json.net,并在另一个项目中作为 NuGet 包下载了Newtonsoft.jsonNewtonsoft.json正在工作,我尝试在 Unity 项目中使用此工作解决方案。

我需要使用ISerializationBinder来转换抽象类层次结构,并且我只想序列化/反序列化类名,而不是它们的完整程序集名称。(原因是 C# 代码应与不同的程序通信。

我使用具有以下类的解决方案进行序列化(从在线官方示例复制(:

public class KnownTypesBinder : ISerializationBinder
{
public IList<Type> KnownTypes { get; set; }
public Type BindToType(string assemblyName, string typeName)
{
return KnownTypes.SingleOrDefault(t => t.Name == typeName);
}
public void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
assemblyName = null;
typeName = serializedType.Name;
}
}

ISerializationBinderJson.net中不存在。JsonSerializerSettings明显不同:

Newtonsoft.json

public class JsonSerializerSettings 
{
public ISerializationBinder SerializationBinder { get; set; }
}

Json.net

public class JsonSerializerSettings
{
public SerializationBinder Binder { get; set; }
}

System.Runtime.Serialization.SerializationBinder(不是从ISerializationBinder派生出来的(没有称为public void BindToName(Type serializedType, out string assemblyName, out string typeName)的方法,这意味着类型名不能被定义。

  • 那么,如何在 Unity 中仅使用类名来解决序列化问题呢?(这里只有设置TypeNameHandling = TypeNameHandling.Objects,不是解决方案(
  • 为什么每个人都声称他们是一样的,而事实显然并非如此?(即使是下面的 StackOverflow 标签Json.net也可以做到这一点。
  • 这种差异与 Unity 使用 Mono 的事实有关吗?

谢谢。

这是一个版本控制问题。您所指的JSON .NET for Unity只是Json.NET使用(如评论中所述(Newtonsoft.Json 8.0.3。

如果你想使用Newtonsoft.Json的新功能,我建议跳到不同的解决方案。目前为Unity制作的Newtonsoft.Json的最新分支在这里:https://github.com/jilleJr/Newtonsoft.Json-for-Unity#readme,在撰写本文时位于Newtonsoft.Json 12.0.3。

jilleJr/Newtonsoft.Json-for-Unity 也是通过内置的 Unity Package Manager 部署的,因此作为用户保持最新状态也会更容易。

最新更新