C# 反序列化运行时创建的类
我尝试用C#和JSON.net反序列化运行时创建的类型,但它抛出了一个resolve type异常 我有一个空的BaseElement类,所有运行时创建的类型都从中继承,所有类型都保证在反序列化过程之前创建,并且我使用TypeNameHandling=TypeNameHandling.all设置进行序列化和反序列化 创建类的过程如下(简化为一个示例): 序列化/反序列化如下所示: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
//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(数据、设置);
希望它能帮助我处境相同的人
干杯感谢您抽出时间发布您的解决方案!