我在一个应用程序中有一个数据模型,我希望通过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中开放和开发。
答案 0 :(得分:1)
您可以尝试实现自定义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()
});