实现IXmlSerializable时,如何只覆盖ReadXml或WriteXml而不是两者?

时间:2009-03-13 23:25:38

标签: c# .net xml serialization

我想在类上实现IXmlSerializable,只覆盖ReadXml或WriteXml,但不能同时覆盖两者。如果我没有在这个类上实现IXMLSerializable,XMLSerializer会自动序列化所有成员。我希望该默认行为适用于未覆盖的案例。但是,由于IXmlSerializable是一个接口,而不是基类,我不知道该怎么做。

此外,在一种情况下,我需要执行默认行为,并在完成时添加一些额外的代码。所以,我想覆盖并回调'基类'行为。同样,如果有一个基类,这将是微不足道的,但不是那么微不足道,因为这是一个接口。

谢谢!

2 个答案:

答案 0 :(得分:5)

在序列化/反序列化之前/之后执行操作的能力由属性提供。使用OnDeserializedAttribute标记一个方法,以便在反序列化实例后调用它,只需确保该方法具有正确的签名:

[OnDeserializedAttribute()]
private void RunThisMethod(StreamingContext context) { 
  // ...
}

NB。此属性适用于二进制,SOAP和DataAttribute格式化程序,但不适用于XmlSerializer 。除了实现IXmlSerializable之外,没有任何属性或机制。

另外请不要忘记您可以直接读取XML文档并将代码写入(反)序列化。


原始答案: 如果你需要完全覆盖序列化或反序列化之一(并因此实现IXmlSerializable,那么你必须自己做两个。

可以使用属性和其他机制来避免使用IXmlSerializable,您是否可以使用为什么的详细信息扩展问题,只需要实现{{1}中的一个}或ReadXml

答案 1 :(得分:1)

您需要实现这两种方法,但这是您的全部责任(就编译器而言)。您可以在不使用的方法中返回null或抛出异常。

修改

I'd like the default behavior to apply for the non-overridden case.

您指的是什么默认行为?由于您正在实现接口,因此没有默认行为。