У меня есть следующий код:XML десериализации производных классов C#
[XmlRoot(ElementName = "Container")]
public class Container {
[XmlArray("Items", IsNullable = false)]
[XmlArrayItem("Item")]
public List<BaseItem> Items { get; set; } = new List<BaseItem>();
}
public class BaseItem {
[XmlAttribute("SomeField")]
public string SomeField {get;set;}
}
public class DerivedItem : BaseItem {
[XmlAttribute("OtherField")]
public string OtherField {get;set;}
}
Как десериализации:
<Container>
<Items>
<Item SomeField="Value"/>
<Item SomeField="Value" OtherField="OtherValue"/>
</Items>
</Container>
так, Элементы поля в объекте Контейнер может содержать BaseItem и DerivedItem объекты из XML выше?
'XmlSerializer' определяет тип имени элемента. Было бы приемлемо иметь ' ' вместо этого? –
dbc
На самом деле это недопустимый XML - так что все ответы - дерьмо. Вы ДОЛЖНЫ разделить наследование по имени элемента по стандарту XML. Затем вы определяете несколько записей XmlArrayItem с именем и типом подкласса. ЭТО XML - то, что вы просите здесь, не имеет классов, основанных на xml, в соответствии с XML-спецификацией. – TomTom
В качестве альтернативы, вы бы хотели иметь ' '? Вы можете сделать это, добавив ['[XmlInclude (typeof (DerivedItem))]'] (https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlincludeattribute%28v=vs.110% 29.aspx). См. Также [Xsi: тип поддержки привязки атрибутов] (https://msdn.microsoft.com/en-us/library/ca1ks327%28v=vs.100%29.aspx). –
dbc