При реализации IXmlSerializable, как только переопределять ReadXml или WriteXml, а не то, и другое?

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

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

Спасибо!

Ответ 1

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

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

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

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


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

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

Ответ 2

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

ИЗМЕНИТЬ

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

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