我使用Json.NET (6.0.3)进行序列化。我编写了一个自定义JsonConverter TestConverter来处理某些BaseClass的实例(通过将它们转换为整数id和返回)。当我用JsonConverter[typeof(TestConverter)]注释类中的属性时,一切都很好。
然而,我非常喜欢使用自定义契约解析器,根据文档,它应该能够完全替换所有属性的使用。
下面是我如何设置合同解析器:
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (typeof(BaseClass).IsAssignableFrom(property.PropertyType))
{
property.Converter = new TestConverter();
}
return property;
}所有的东西都可以用于序列化,但是在反序列化过程中,我在契约解析器中设置的转换器似乎完全被忽略了。从来不调用TestConverter的TestConverter方法。
我错过了什么很明显的东西吗?我是否需要将转换器附加到其他地方的属性上?
我创建了一个可运行的小例子来演示这个问题。如果第57行中的[JsonConverter]属性被注释掉,程序将崩溃,因为Json.net试图将一个整数转换为一个对象,而不是使用TestConverter。这个例子的源代码可以在这里找到:http://pastebin.com/xgVS6hXY
提前感谢您的帮助!
发布于 2014-07-25 13:28:27
从[JsonConverter(typeof(TestConverter))]类的Artist属性中移除Song属性。将合同解析器的设置更改为以下示例:
public class TestContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (typeof(BaseClass).IsAssignableFrom(property.PropertyType))
{
var converter = new TestConverter();
property.Converter = converter;
property.MemberConverter = converter;
}
return property;
}
}一切都应该很好。
https://stackoverflow.com/questions/24946362
复制相似问题