Json.NET与Newtonsoft.Json SerializationBinder有所不同

时间:2018-09-13 06:39:38

标签: c# json unity3d mono json.net

我知道这个主题中有很多类似的问题,但是我在这里找不到答案。

我已经在Unity中下载了Json.net,在另一个项目中下载了Newtonsoft.json作为NuGet软件包。 Newtonsoft.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,并不是解决方案)
  • 为什么不是所有人都声称自己是同一个人吗? (即使下面的Json.net的StackOverflow标签也可以做到这一点。)
  • 差异与Unity使用Mono的事实有关吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

这是版本控制问题。您所指的JSON .NET for Unity仅使用Json.NET(如注释中所述)使用Newtonsoft.Json 8.0.3。

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

jilleJr / Newtonsoft.Json-for-Unity也通过内置的Unity Package Manager进行部署,因此,使用户保持最新状态也很容易。