我想在类上实现IXmlSerializable,只覆盖ReadXml或WriteXml,但不能同时覆盖两者。如果我没有在这个类上实现IXMLSerializable,XMLSerializer会自动序列化所有成员。我希望该默认行为适用于未覆盖的案例。但是,由于IXmlSerializable是一个接口,而不是基类,我不知道该怎么做。
此外,在一种情况下,我需要执行默认行为,并在完成时添加一些额外的代码。所以,我想覆盖并回调'基类'行为。同样,如果有一个基类,这将是微不足道的,但不是那么微不足道,因为这是一个接口。
谢谢!
答案 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.
您指的是什么默认行为?由于您正在实现接口,因此没有默认行为。