我知道这个话题有很多类似的问题,但我没有在这里找到答案。
我已经下载了 Unity 中的Json.net
,并在另一个项目中作为 NuGet 包下载了Newtonsoft.json
。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;
}
}
ISerializationBinder
在Json.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 部署的,因此作为用户保持最新状态也会更容易。