在不同应用程序之间使用Newtonsoft库反序列化类型处理的JSON



我在一个应用程序中有一个数据模型,我希望通过TCPIP与另一个应用程序交换。我需要使用类型处理,因为我希望有一个包含派生类型的抽象类型的单个列表,而不是每个派生类型的多个列表。如图所示:

这:

public Dictionary<int, Parameter> Parameters { get; set; }

取而代之的是:

public Dictionary<int, BooleanParameter> BooleanParameters { get; set; }
public Dictionary<int, AnalogParameter> AnalogParameters { get; set; }
public Dictionary<int, SerialParameter> SerialParameters { get; set; }
public Dictionary<int, CommandTrigger> CommandTriggers { get; set; }

当我使用类型处理进行序列化时,将包含命名空间和项目名称,因此第二个应用程序无法协商类型。

"$type": "NAMESPACE_NAME.MyObjectType, PROJECT_NAME"

如何告诉反序列化程序忽略命名空间和项目名称?相同的对象,但不同的项目/命名空间。我甚至可以使命名空间匹配,但项目名称是我的绊脚石。在传递给反序列化程序之前必须重新处理 json 似乎很笨拙。

需要注意的是,我无法创建要在两个应用程序之间共享的类库。第一个应用程序在专有硬件上运行,VS2008环境是沙盒化的。不能引用外部或用户库。第二个应用程序在VS2015中开放和开发。

您可以尝试实现自定义ISerializationBinder来处理所需的类型:

public class MyCustomSerializationBinder : ISerializationBinder
{
public Type BindToType(string assemblyName, string typeName)
{
switch(typeName)
{
case "BooleanParameter":
return typeof(BooleanParameter);
case "AnalogParameter":
return typeof(AnalogParameter);
case "SerialParameter":
return typeof(SerialParameter);
case "CommandTrigger":
return typeof(CommandTrigger);
}
return null;
}
public void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
assemblyName = null;
typeName = serializedType.Name;
}
}

并在JsonSerializerSettings内部使用它:

var obj = JsonConvert.DeserializeObject(json, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
SerializationBinder = new MyCustomSerializationBinder()
});

相关内容

最新更新