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

时间:2017-05-26 17:36:39

标签: c# json json.net

我在一个应用程序中有一个数据模型,我希望通过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中开放和开发。

1 个答案:

答案 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()
});