Проблема десериализации объекта XML? - PullRequest
2 голосов
/ 13 ноября 2010

Мои объекты имеют отношения родитель-ребенок.Каждый дочерний объект имеет свойство Parent , указывающее на его контейнер.Когда этот объект создается в приложении, он устанавливается, и, таким образом, никаких проблем.Это родительское свойство помечено атрибутом XmlIgnore, поскольку его необходимо установить в родительский экземпляр времени выполнения.Итак, как лучше всего инициализировать это свойство Parent после десериализации объекта?Есть ли событие «Десериализация завершена» или что-то подобное?

РЕДАКТИРОВАТЬ: я говорю о XmlSerializer в C # WPF.Я не хочу двоичный сериализатор.

Ответы [ 2 ]

1 голос
/ 13 ноября 2010

Ваш вопрос несколько лишен деталей, но из некоторых описанных вами атрибутов и свойств я собираюсь предположить, что вы используете XMLSerializer в .NET Framework.

Возможно, вы знаете об атрибуте OnDeserialized , который можно использовать для обозначения определенного метода, который вы хотите вызывать после десериализации объекта.К сожалению, это работает только с форматерами Binary, SOAP и DataAttribute, , а не для XMLSerializer.

Для того, чтобы реализовать те же функции с помощью XMLSerializer, вам придетсяреализовать IXmlSerializable интерфейс самостоятельно в классе, который вы хотите сериализовать в XML.Это позволит вам полностью контролировать процесс сериализации и десериализации экземпляров вашего класса, включая код, запускаемый для инициализации свойства Parent после десериализации объекта.

В CodeProject есть хорошая примерная статьякоторый описывает, как правильно реализовать IXmlSerializable доступно здесь .

1 голос
/ 13 ноября 2010
Боюсь, что

XmlSerializer не обеспечивает обратные вызовы сериализации.Один из способов сделать это для parent , чтобы обработать это при добавлении - но вам понадобится пользовательская коллекция (возможно, унаследованная от Collection<T>), которая во время Add / Remove вызывает некоторый метод длядочерний элемент для добавления (или удаления, если удаляется из коллекции) родительского элемента.

В качестве альтернативы - рассмотрите возможность сделать его просто односторонним деревом - т. е. дочерний элемент не имеет родительский элементсвойство.

Другой вариант - просто пройти модель по коду после десериализации и исправить все родительские значения.

Последний вариант - реализовать IXmlSerializable, но это очень трудно получить право.

...