Сериализация списка дочерних объектов для элементов корневого уровня - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь сериализовать родительский объект, содержащий List дочерних элементов, в XML, который состоит из родительского элемента с каждым дочерним объектом в качестве отдельного элемента. Я хотел бы, чтобы это применялось всякий раз, когда дочерний тип сериализуется, поэтому реализация IXmlSerializable на дочернем типе кажется идеальной; Однако я не нашел самостоятельного решения. В качестве альтернативы, возможно предоставление XmlAttributeOverrides для XmlSerializer? Я не против добавления атрибутов в Parent, но хотел бы избежать любой реализации ISerializable на Parent (так как у меня есть много типов, которые могут иметь ссылки на Child).

Пример иерархии классов:

public class Parent {
    public string Name { get; set; }
    public string SomeProperty { get; set; }
// ....
    public List<Child> Children { get; set; }
}

public class Child { 
    public string Name { get; set; }
    public string Value { get; set; }
}

var o = new Parent {
   Name = "Test Parent",
   Children = new List<Child> {
      new Child { Name = "Alice", Value = "This is alice's value" },
      new Child { Name = "Bob", Value = "This is bob's value" }
   }
};

Должен сериализоваться в:

<Parent>
  <Name>Test Parent</Name>
  <Alice>This is alice's value</Alice>
  <Bob>This is bob's value</Bob>
</Parent>

Я создал реализацию IXmlSerializable для Child как:

public void WriteXml(XmlWriter writer) {     
   writer.WriteElementString(Name, Value.ToString());
}

И добавил [XmlElement] на Children. Это правильно сериализует дочерний элемент, но он все равно будет вложен на один уровень слишком глубоко под Родителем, например ::

<Parent>
  <Children>
    <Alice>this is alice</Alice>
 </Children>
</Parent>

Надеюсь, мне не хватает какой-то хитрости. Спасибо!

1 Ответ

1 голос
/ 13 мая 2019

За документы :

Предоставленная вами реализация WriteXml должна записать XML-представление объекта. Фреймворк записывает элемент-оболочку и позиционирует XML-модуль записи после его запуска .Ваша реализация может написать свое содержимое, включая дочерние элементы. Затем платформа закрывает элемент-оболочку.

Так что при сериализации Parent платформа будет писать Children, а затем несколько элементов Child, вызывая вашу реализацию IXmlSerializable.WriteXmlна Child для каждого, чтобы написать их содержание .

Если вы добавите [XmlElement] к Children, то будет записано несколько элементов Children (так называется имясвойство), а затем вызвать вашу реализацию для каждого дочернего элемента.

Учитывая, как это работает, я не уверен, что у вас есть какие-либо другие варианты, кроме реализации IXmlSerializable в Parent.

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