如何在自定义Json转换器中使用默认序列化。

55

我有一个复杂的对象图,在使用Json.NET进行序列化/反序列化。其中一些对象是从抽象类派生而来的,因此为了使反序列化正常工作,我需要创建一个自定义的JsonConverter。它的唯一作用是在反序列化时选择适当的抽象类的具体实现,然后让Json.NET继续进行。

我的问题在于当我想要序列化时。我根本不需要进行任何自定义操作。我希望得到与没有自定义JsonConverter使用JsonConvert.SerializeObject完全相同的行为。

然而,由于我正在使用自定义的JsonConverter类满足我的反序列化需求,我被迫提供一个WriteJson实现。由于WriteJson是抽象的,我无法直接调用base.WriteJson,但我想做类似那样的事情。所以我的问题是,我该在这个方法中放什么来获得普通的默认行为?换句话说:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    // What goes here to get default processing?
}

1
为什么不在序列化器设置中将TypeNameHandling打开到Auto呢?这将添加一个"$type"属性,如果实例类型与其声明的属性类型不同(这将是接口或基类类型)。这难道不正是你想要的吗? - P.W.
1个回答

77
在您自定义的 JsonConverter 中,覆盖 CanWrite 并返回 false:
public override bool CanWrite { get { return false; } }

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    throw new NotImplementedException();
}

如果不会被调用,那么你可以在WriteJson中抛出异常。

(同样地,在序列化时获取默认行为,重写CanRead并返回false。)

请注意,相同的方法可以用于 JsonConverter<T>(在Json.NET 11.0.1中引入),因为它只是JsonConverter的子类,引入了类型安全版本的 ReadJson()WriteJson()

3
太明显了 :),谢谢! - MuiBienCarlota
哦,那个CanWrite...可惜即使在文档中也不够清晰。完全忘记查看基本类型了。谢谢。 - Nordes
1
这非常愚蠢。这与坚实的原则相反。 - Dmitry Bogomaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接