C# 反序列化运行时创建的类

C# 反序列化运行时创建的类,c#,json.net,deserialization,C#,Json.net,Deserialization,我尝试用C#和JSON.net反序列化运行时创建的类型,但它抛出了一个resolve type异常 我有一个空的BaseElement类,所有运行时创建的类型都从中继承,所有类型都保证在反序列化过程之前创建,并且我使用TypeNameHandling=TypeNameHandling.all设置进行序列化和反序列化 创建类的过程如下(简化为一个示例): 序列化/反序列化如下所示: //Data is a BaseElement[] array with the ClassInfo

我尝试用C#和JSON.net反序列化运行时创建的类型,但它抛出了一个resolve type异常

我有一个空的BaseElement类,所有运行时创建的类型都从中继承,所有类型都保证在反序列化过程之前创建,并且我使用TypeNameHandling=TypeNameHandling.all设置进行序列化和反序列化

创建类的过程如下(简化为一个示例):

序列化/反序列化如下所示:

        //Data is a BaseElement[] array with the ClassInfo instances

        //Serialize

        JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
        string res = JsonConvert.SerializeObject(Data, Formatting.Indented, settings);

        //Deserialize

        var deser = JsonConvert.DeserializeObject <BaseElement[]>(res, settings);
class binder : SerializationBinder
{
    Type[] types;
    public binder(Type[] Types)
    {
        types = Types;
    }

    public override Type BindToType(string assemblyName, string typeName)
    {
        if(assemblyName == "RaspElements")
        {

            var type = types.Where(t => t.Name == typeName).FirstOrDefault();

            if (type != null)
                return type;

        }
        return Type.GetType(typeName + ", " + assemblyName);
    }
}
//数据是带有ClassInfo实例的BaseElement[]数组
//连载
JsonSerializerSettings=new JsonSerializerSettings{TypeNameHandling=TypeNameHandling.All};
string res=JsonConvert.SerializeObject(数据、格式、缩进、设置);
//反序列化
var deser=JsonConvert.DeserializeObject(res,settings);
确切的错误是:

Newtonsoft.Json.dll中发生类型为“Newtonsoft.Json.JsonSerializationException”的未处理异常 其他信息:解析JSON“ClassInfo,RaspElementTypes”中指定的类型时出错。路径“$values[0]。$type”

你知道如何反序列化运行时创建的类型吗


谢谢。

嗯,找到了,只需要创建一个SerializationBinder来提供正确的类型

在mi确切情况下,活页夹如下所示:

        //Data is a BaseElement[] array with the ClassInfo instances

        //Serialize

        JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
        string res = JsonConvert.SerializeObject(Data, Formatting.Indented, settings);

        //Deserialize

        var deser = JsonConvert.DeserializeObject <BaseElement[]>(res, settings);
class binder : SerializationBinder
{
    Type[] types;
    public binder(Type[] Types)
    {
        types = Types;
    }

    public override Type BindToType(string assemblyName, string typeName)
    {
        if(assemblyName == "RaspElements")
        {

            var type = types.Where(t => t.Name == typeName).FirstOrDefault();

            if (type != null)
                return type;

        }
        return Type.GetType(typeName + ", " + assemblyName);
    }
}
反序列化的过程更改为:

//runtimeTypes is a Type[] with all the runtime generated types, data is the serialized string

JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All, Binder = new binder( runtimeTypes ) };

var deser = JsonConvert.DeserializeObject <BaseElement[]>(data, settings);
//runtimeTypes是包含所有运行时生成的类型的类型[],数据是序列化字符串
JsonSerializerSettings=new JsonSerializerSettings{TypeNameHandling=TypeNameHandling.All,Binder=new Binder(runtimeTypes)};
var deser=JsonConvert.DeserializeObject(数据、设置);
希望它能帮助我处境相同的人


干杯

感谢您抽出时间发布您的解决方案!