无法使用转换器反序列化对象?

时间:2013-12-02 06:52:51

标签: json.net deserialization strong-typing

给定{"$type":"MyType, MyAssembly","seed":0"}形式的JSON字符串,为什么JsonConvert.DeserializeObject不能使用与“MyType”关联的JsonConverter?

我尝试使用[JsonConverter(typeof(MyType))]属性修饰MyType类。不行。永远不会调用自定义JsonConverter的ReadJson方法。

我尝试将自定义转换器添加到序列化程序的设置转换器集合中,并确保CanConvert方法对“MyType”返回true,并且CanRead方法返回true。不行。无论是转换器的CanConvert还是其ReadJson方法都没有被调用过。

DeserializeObject方法需要能够反序列化包含类型在编译时未知的对象的JSON字符串,但其类型通过特殊的“$ type”成员嵌入到JSON对象中。因此,不建议使用DeserializeObject<T>或指出它适用于成员,其类型在合同中已经确定。

仅供参考,这个问题可以归结为反序列化只需要从嵌入式“$ type”成员中识别对象类型的情况,例如,如果JSON对象位于无类型的JSON数组中,它也无法解析转换器,而不只是在顶层。

基本上,对象无法通过序列化/反序列化过程进行往返,因为虽然在调用SerializeObject时将为Converter调用WriteJson方法,但是当您随后将JSON字符串传递给DeserializeObject时,它无法调用转换器的ReadJson方法,而是构造一个新实例并使用基本成员填充例程。

0 个答案:

没有答案