这是我在这个网站上提出的第一个问题,如果我错过了什么,请原谅我。
我在使用JSON.NET反序列化复杂对象图时遇到了一些问题。我的类层次结构(简化)如下:
public abstract class BusinessObjectBase
{
protected BusinessObjectBase(SerializationContext context)
{
}
}
public class TestBusinessObject : BusinessObjectBase
{
protected TestBusinessObject(SerializationContext context)
: base(context)
{
}
public NestedObject InnerObject { get; set; }
}
public class NestedObject : BusinessObjectBase
{
protected NestedObject(SerializationContext context)
: base(context)
{
}
}
这些类没有默认的ctor,而是一个专用的自定义反序列化ctor(除了带参数的其他公共ctor),如示例所示。为了创建一个实例,我编写了一个自定义创建转换器,如下所示:
internal class BusinessObjectCreationConverter : CustomCreationConverter<BusinessObjectBase>
{
public override bool CanConvert(Type objectType)
{
return typeof(BusinessObjectBase).IsAssignableFrom(objectType) && !objectType.IsAbstract;
}
public override BusinessObjectBase Create(Type objectType)
{
var businessObject = objectType.CreateUsingDesrializationConstructor<BusinessObjectBase>();
return businessObject;
}
}
CreateUsingDesrializationConstructor()扩展方法查找特殊反序列化ctor并使用ctor创建实例。
我将转换器添加到我的JSON.NET序列化程序实例:
public class NewtonsoftJsonSerializer : ISerializer
{
public NewtonsoftJsonSerializer()
: this(new JsonSerializer
{
TypeNameHandling = TypeNameHandling.Auto,
ObjectCreationHandling = ObjectCreationHandling.Replace,
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
DefaultValueHandling = DefaultValueHandling.Ignore,
ContractResolver = new KsJsonContractResolver()
})
{
this.serializer.Converters.Add(new BusinessObjectCreationConverter());
}
public T Deserialize<T>(Stream stream)
{
T result;
using (var streamReader = new StreamReader(stream, Encoding.UTF8, true, BufferSize, true))
using (var jsonReader = new JsonTextReader(streamReader))
{
result = this.serializer.Deserialize<T>(jsonReader);
}
return result;
}
}
当我反序列化TestBusinessObject时,我可以从调试器看到转换器询问每种类型是否能够创建实例:TestBusinessObject,NestedObject和许多其他类型。但我的转换器只被要求创建一个新的TestBusinessObject实例,他 NOT 请求创建嵌套的NestedObject实例我所期望的和我非常需要的,因为反序列化ctor中有一些有线逻辑。
我在这里做错了,如何告诉JsonSerializer将转换器用于每个对象,甚至不是根(顶层)对象?
修改 当一个BusinessObjectBase实例包含在我不知道的类型的对象中时,认为变得更加复杂。在这种情况下,我还希望调用转换器。
提前致谢, 卡斯滕
答案 0 :(得分:0)
尝试将[DataContract]属性赋予要序列化或反序列化的类,并确保在这些类中具有此属性的任何数据。例如。
[DataContract]
public class TestBusinessObject : BusinessObjectBase
{
protected TestBusinessObject(SerializationContext context)
: base(context)
{{
}
public NestedObject InnerObject { get; set; }
}