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

C# 在不同应用程序之间使用Newtonsoft库反序列化类型处理的json,c#,json,json.net,C#,Json,Json.net,我希望通过TCPIP与另一个应用程序交换一个应用程序中的数据模型。我需要使用类型处理,因为我想要一个包含派生类型的抽象类型列表,而不是每个派生类型都有多个列表。如图所示: 这: public Dictionary<int, Parameter> Parameters { get; set; } 如何告诉反序列化程序忽略名称空间和项目名称?相同的对象,但不同的项目/命名空间。我甚至可以让名称空间匹配,但项目名称是我的绊脚石。在传递到反序列化程序之前,必须重新处理json,这似乎很笨拙

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

这:

public Dictionary<int, Parameter> Parameters { get; set; }
如何告诉反序列化程序忽略名称空间和项目名称?相同的对象,但不同的项目/命名空间。我甚至可以让名称空间匹配,但项目名称是我的绊脚石。在传递到反序列化程序之前,必须重新处理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()
});

这就是我遇到沙箱问题的地方。似乎只有该库的精简版本可用。ISerializationBinder接口不存在,存在SerializationBinder抽象类,但它不包含BindToName方法,仅包含BindToType。当我使用它时,它仍然在json中生成名称空间和项目名称,并使用您在另一个应用程序端提供的实现,它无法解析所提供的完全限定类型。我将接受这个答案,因为它主要回答了这个问题,并得到了我需要的东西,但沙箱阻止了我整体实现它。不过,在反序列化之前,我暂时可以通过替换json中的名称空间和项目名称来实现这一点,直到我找到一个更优雅的解决方案为止。不幸的是,您无法在沙盒环境中使用
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;
    }
}
var obj = JsonConvert.DeserializeObject(json, new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Objects,
    SerializationBinder = new MyCustomSerializationBinder()
});