.NET XmlSerializer и несколько ссылок на тот же объект

Мой репозиторий имеет List<Student>, List<Course> и List<Enrolment> где Прием имеет Прием. Студент и Прием. Курс, которые являются ссылками один из студентов или курсов в двух предыдущих списках.

Когда я использую XmlSerializer на своем репозитории, он производит избыточные данные, поскольку он сериализирует все свойства каждого студента в List<Student> с другой стороны для каждой ссылки на тех тех же студентов в List<Enrolment>. Я ищу изящный способ решить это.

После десериализации я могу зафиксировать ссылки с помощью Значений идентификаторов в дублирующихся экземплярах объектов, созданных десериализацией, но это кажется hackish.

Один метод для фиксации избыточного вывода к Приему XmlIgnore. Студент и Прием. Курс и создает еще два свойства для сериализации - Прием. StudentID и Прием. CourseID. Однако во время десериализации, ссылок для Приема. Студент и Прием. Курс не может быть установлен (AFAIK) начиная с результатов десериализации List<Student> и List<Course> не доступны.

Другой метод, о котором я думал, должен сериализировать, опускаются в моей иерархии объектов, делающей каждый из моих Списков отдельно и управляющей порядком десериализации - я скорее не делаю это.

Другой метод был бы к XmlIgnore List<Enrolment> и создайте класс помощника сериализации приема, который инициализирует List<Enrolment> после того, как десериализация себя завершена. Это походит на большое усилие.

Как другие люди сериализируют/десериализовывают несколько ссылок на то же использование объекта XmlSerializer?

8
задан Luke Rohde 8 January 2010 в 14:39
поделиться

4 ответа

О, боли сериализации :-> ...

Для этого никогда не было общего решения, наверное, поэтому MS вычеркнул его из фреймворка Silverlight.

Я никогда не полагаюсь ни на какие механизмы автоматической сериализации фреймворка .net. Для моих собственных моделей и репозиториев я обычно знаю или могу легко программно определить, какие свойства являются простыми скалярными (числа/строки/ и т.д.), а какие - ссылками на другие объекты (а также какие - списками обоих).

В основном существует 2 сценария:

1: Мы хотим сериализовать/передать только плоскую информацию об объектах. В этом случае я передаю только соответствующие ID для свойств, которые ссылаются на другие объекты. Затем получатель может делать последующие запросы, чтобы получить все остальные нужные ему объекты.

2: Мы хотим передать как можно больше информации, т.е. более глубокий вложенный XML с несколькими уровнями, в основном для некоторой отчетной функциональности, отображающей все непосредственно, используя только некоторые CSS на XML. В таком случае, на самом деле желательно, чтобы одни и те же объекты разрешались многократно в дерево XML.

Иногда мне нужно немного подкорректировать первый сценарий, чтобы избежать слишком большого количества последующих вызовов запросов, но обычно я очень хорошо лажу. Т.е. я встроил в нашу кодовую базу, что мы можем указать, какие дополнительные объекты мы хотим разрешить, когда, и/или где-то настроено

.
3
ответ дан 5 December 2019 в 21:19
поделиться

Нет решения этой проблемы с помощью сериализатора XML. В нем нет концепции идентичности, которую он мог бы использовать для устранения дублирования.

Лучшее, что можно сделать, это сериализовать пул объектов отдельно от их ссылок. После десериализации вы можете воссоздать свои списки.

BTW, знаете ли вы, что XmlSerializer не специфичен для C#?

2
ответ дан 5 December 2019 в 21:19
поделиться

Вы можете реализовать интерфейс IXmlSerializable для Enrollment и в методе WriteXml генерирует XML студента и курса, который будет содержать только ключи, например:

<Student Id="5"/>
<Course Id="6"/>

, а в методе ReadXml вы можете загружать ссылки из этого. Вы также должны установить атрибут XmlIgnore для свойства Student и Course.

2
ответ дан 5 December 2019 в 21:19
поделиться

Как этот звук в качестве решения:

  1. XMLIGNORE каждый вторичный Ссылка IE angratment.student & Enrolment.course
  2. Создать свойство для каждого вторичного Ссылка, которая используется для сериализация / десериализировать внешний ключ Для этой ссылки вместо - префикс с xml_fk. например, xml_fk_student & Xml_fk_course
  3. Создать метод xml_finalivedeseriation, который называется после десериализации для загрузки Ссылки, использующие эти иностранные Ключевые свойства.
0
ответ дан 5 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: