В то время как XmlSerializer
может напрямую сериализовать List<T>
, как вы делаете с new XmlSerializer(typeof(List<DriveData>))
, компромисс в том, что вы ничего не можете сделать с именами произведенных элементов.Лучший способ - обернуть список в класс, который будет приписываться следующим образом:
[XmlRoot("HardDrives")]
public class DiskDrives
{
[XmlElement("HardDrive")]
public List<DriveData> Drives { get; set; }
}
Атрибут [XmlRoot]
обозначает элемент документа верхнего уровня, а атрибут [XmlElement]
контролирует, как свойствосериализуется.
XML, полученный с помощью XmlSerializer
, будет выглядеть следующим образом:
<?xml version="1.0" encoding="utf-16"?>
<HardDrives xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<HardDrive>
<Model>WD</Model>
…
</HardDrive>
<HardDrive>
<Model>Seagate</Model>
…
</HardDrive>
</HardDrives>
В случае, если вы встраиваете List<DriveData>
в более сложную структуру, альтернативныйподход заключается в использовании атрибутов [XmlArray]
и [XmlArrayItem]
, которые управляют тем, как сериализуется свойство IEnumerable
и какое имя элемента применяется к его элементам.Следующая структура данных:
[XmlRoot("Inventory")]
public class Inventory
{
… more properties here…
[XmlArray("HardDrives")]
[XmlArrayItem("HardDrive")]
public List<DriveData> Drives { get; set; }
}
выдаст такой XML-код:
<?xml version="1.0" encoding="utf-16"?>
<Inventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
… more properties would be serialized here …
<HardDrives>
<HardDrive>
<Model>WD</Model>
…
</HardDrive>
<HardDrive>
<Model>Seagate</Model>
…
</HardDrive>
</HardDrives>
</Inventory>