我有一个名为NProcess的抽象类,将从中派生许多不同的Process对象。
public abstract class NProcess
{
public ProcessConfigurations ProcessSettings { get; set; }
}
ProcessessConfigutations类如下所示:
[Browsable(true)]
public abstract class ProcessConfigurations { }
从NProcess派生的对象的示例是EmailReader, FileCopier or FTPProcess
.....可以是任何东西,因此从ProcessConfigurations派生的属性类将具有一组仅与流程相关的属性。
我能够加载从Nprocess
使用Reflection派生的过程,并且当我选择一个时,将按预期在属性网格中显示一组不同的属性。
我正在序列化设置并将其作为BSON存储在数据库中。
问题:反序列化向我显示了Json字符串,但出现以下错误:
无法将类型'Newtonsoft.Json.Linq.JObject'隐式转换为'ProcessConfigurations'
我需要能够将JObject强制转换或转换为从'ProcessConfigurations'派生的任何动态Type,但是我无法获取派生的类型。
如果每个配置都是不同的类,那么当它们从数据库中出来时,您怎么知道它们应该是什么类型?假设您查询数据库并返回
{ "SourceFullPath": "c\\Source", "Destination": "c:\\temp", "OnExists": 1 }
您不知道应该将其反序列化为哪种具体类型。而且,您不能仅将其填充到ProcessConfigurations
类中,因为abstract
无法实例化类(反序列化器从概念上讲需要“新建”一个对象,然后将JSON属性复制到其中)。
所以,你可以做什么?
直接的答案是在序列化的Json中包括类型信息。Json.Net具有一项功能,它将自动为您执行此操作。它称为TypeNameHandling。生成的Json看起来像:
{ "$type": "Your.Namespace.Here.MyConcreteProcessConfiguration, Your.Assembly.Here", "SourceFullPath": "c\\Source", "Destination": "c:\\temp", "OnExists": 1 }
然后,当反序列化时,Json.Net将知道要“更新”哪种类型。
如果您不想使用Json.Net的内置方法来执行此操作,则必须将类型信息存储在自己的字段中,并编写JsonConverter
@JDB链接中提到的自定义:JSON.NET反序列化为抽象类或接口。JsonConverter
实际上,该代码会反序列化(取自上述博客文章):
public class MyConverter : JsonConverter {
// ... other stuff, see the blog article
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
if (jo["MyCustomType"].Value<string>() == "MyConcreteProcessConfiguration")
return jo.ToObject<MyConcreteProcessConfiguration>(serializer);
if (jo["MyCustomType"].Value<string>() == "MyOtherConcreteProcessConfiguration")
return jo.ToObject<MyOtherConcreteProcessConfiguration>(serializer);
return null;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句