Вы можете сделать это с помощью XmlSerializer.
Однако будьте осторожны со следующим:
- Массив, который вы сериализуете / десериализуете, должен быть объявлен как массив объекта ""(или базовый объект, если все другие типы наследуют его)
- К каждому типу будет прикреплен" xsi: type "
- Вы должны использовать [XmlInclude], чтобы включить все типы (s) вам когда-либо понадобится этот «корневой» объект.
Необходимость [XmlInclude] всех типов объектов означает, что вы не сможете динамически добавлять типы всериализации.Вам нужно будет добавить [XmlInclude] и перекомпилировать, чтобы включить новые типы.
Однако ваш XML станет:
<Objects>
<TypeObj xsi:type="TypeA">...</TypeObj>
<TypeObj xsi:type="TypeB">...</TypeObj>
<TypeObj xsi:type="TypeA">...</TypeObj>
<TypeObj xsi:type="TypeC">...</TypeObj>
:
</Objects>
Это наиболее гибкийи «нормальный» способ подхода XML-сериализации нескольких типов.Однако, если вам нужно сохранить свой точный формат, вы можете объявить свой класс следующим образом:
[XmlRoot("Objects")]
public class Objects
{
[XmlElement("TypeA")] public TypeA[] TypeAObjects;
[XmlElement("TypeB")] public TypeB[] TypeBObjects;
[XmlElement("TypeC")] public TypeC[] TypeCObjects;
:
}
[XmlElement]
означает, что все объекты перемешаны на одном уровне (отличается от XmlArray
),Они даже не должны быть в порядке.
Однако, подводные камни в этом случае заключаются в том, что если вы хотите добавить новый тип, вам придется изменить класс "Objects".