При реализации IXmlSerializable, как переопределить только ReadXml или WriteXml, а не оба? - PullRequest
11 голосов
/ 14 марта 2009

Я хотел бы реализовать IXmlSerializable для класса и переопределить только ReadXml или WriteXml, но не оба. Если бы я не реализовал IXMLSerializable для этого класса, XMLSerializer автоматически сериализовал бы все члены. Я хотел бы, чтобы это поведение по умолчанию применялось для не переопределенного случая. Однако, поскольку IXmlSerializable - это интерфейс, а не базовый класс, я не уверен, как это сделать.

Кроме того, в одном случае мне нужно выполнить поведение по умолчанию, а когда это будет сделано, добавить дополнительный код. Итак, я хотел бы переопределить и перезвонить «базовому» поведению класса. Опять же, это было бы тривиально, если бы существовал базовый класс, но не так тривиально, поскольку это интерфейс.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 14 марта 2009

Возможность выполнения действий до / после сериализации / десериализации обеспечивается атрибутами. Пометьте метод с помощью OnDeserializedAttribute , чтобы он вызывался после десериализации экземпляра, просто убедитесь, что метод имеет правильную сигнатуру:

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

NB. Этот атрибут работает для форматеров Binary, SOAP и DataAttribute, но не для XmlSerializer. Нет другого атрибута или механизма, кроме реализации IXmlSerializable.

Также не забывайте, что вы можете читать XML-документы напрямую и писать код для (де) сериализации.


Оригинальный ответ: Если вам необходимо полностью переопределить один из вариантов сериализации или десериализации (и, таким образом, реализовать IXmlSerializable, то вы должны сделать оба самостоятельно.

Может быть возможно использовать атрибуты и другие механизмы, чтобы избежать использования IXmlSerializable. Вы можете расширить вопрос подробностями , почему вам нужно реализовать только один из ReadXml или * 1020? *.

1 голос
/ 14 марта 2009

Вам потребуется реализовать оба метода, но это полная ответственность (в отношении компилятора). Вы можете вернуть null или вызвать исключение в методе, который вы не будете использовать.

EDIT

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

Какое поведение по умолчанию вы имеете в виду? Поскольку вы реализуете интерфейс, поведение по умолчанию отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...