При реализации 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.
Какое поведение по умолчанию вы имеете в виду? Поскольку вы реализуете интерфейс, поведение по умолчанию отсутствует.