代码之家  ›  专栏  ›  技术社区  ›  Eric

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

  •  11
  • Eric  · 技术社区  · 15 年前

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

    此外,在一种情况下,我需要执行默认行为,完成后添加一些额外的代码。因此,我想重写并调用“基类”行为。同样,如果有一个基类,这将是微不足道的,但由于这是一个接口,所以也不是那么微不足道。

    谢谢

    2 回复  |  直到 15 年前
        1
  •  5
  •   Richard    15 年前

    OnDeserializedAttribute 要在反序列化实例后调用它,只需确保该方法具有正确的签名:

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

    注意。此属性适用于二进制、SOAP和DataAttribute格式化程序,但 对于XmlSerializer。除了实现IXmlSerializable之外,没有其他属性或机制。

    另外,不要忘记,您可以直接读取XML文档并编写代码进行(反)序列化。


    如果您需要完全覆盖序列化或反序列化(从而实现 IXmlSerializable 那么你必须自己做这两件事。

    可以利用属性和其他机制来避免使用 IXmlSerializable ,你能详细说明一下这个问题吗 您只需要实现其中一个 ReadXml WriteXml .

        2
  •  1
  •   Kyle Trauberman pestades    15 年前

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

    编辑

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