Я пытаюсь сериализовать список, который может содержать объекты дочерних классов. Мне нужно, чтобы в нем отсутствовал какой-либо родительский тег, поэтому XMLElement в списке помог с этим. Моя проблема заключается в том, что отражение списка не знает, что такое дочерние теги.
Я обнаружил, что моя проблема возникает, когда я добавляю тег [XmlRoot] в класс, представляющий мой корневой элемент.
[XmlRoot("EFilingBatchXML", Namespace = "www.fincen.gov/base", IsNullable = false)]
public class XmlRoot
До этого список работал, и я мог использовать либо [XmlInclude] для дочерних классов, либо включать Type[] при создании XmlSerializer. Есть небольшая проблема, включая атрибут:
xsi: тип = "ребенок"
xsi: тип = "Для взрослых"
Похоже, моя проблема связана с корневым тегом, но мне нужно знать, как исключить и эти атрибуты.
Ex)
[XMLElement("Person")]
public List<Person> PersonList { get; set; }
.
.
PersonList = new List<Person>() {
new Child(), new Adult()
};
Мне нужно, чтобы он форматировался как таковой
<root>
...
<Person>
<Person elements>
<Child elements>
</Person>
<Person>
<Person elements>
<Adult elements>
</Person>
...
</root>
Я всегда получаю ошибку
Ребенка не ждали. Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, неизвестные статически.
Буду признателен за любую помощь, поскольку у меня заканчиваются идеи, и я понятия не имею, почему решение Type[] не работает для этого.
[XmlElement]
вместо[XmlArray]
- person Marc Gravell   schedule 02.04.2018Person
имеет подклассыChild
иAdult
. Если это так, то это похоже на дубликат Использование XmlSerializer для сериализации производных классов. Как показано здесь, вы должны применить[XmlElement("Child", Type = typeof(Child))]
к своему списку. Но если это не сработает для вас, нам нужно будет увидеть минимально воспроизводимый пример, показывающий вашиPerson
,Child
иAdult
типов, а также полный необходимый XML. - person dbc   schedule 03.04.2018