Я делаю это довольно часто. Я обычно использую класс верхнего уровня, который инкапсулирует свойство коллекции в качестве члена и имеет отношение один к одному с файлом XML. Членами этого класса могут быть коллекции или простые атрибуты и т. Д.
Вот фрагмент кода для набора пользовательских объектов:
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlRootAttribute(ElementName = "DeployRuns", Namespace = "", IsNullable = false)]
public class DeployRuns : List<RunDetail>
{
И затем, если вы хотите инкапсулировать вашу коллекцию в другой класс, который будет сериализован, смотрите свойство bottom этого класса:
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public class DeployDetails
{
public DeployDetails()
{
this.DeployRuns = new DeployRuns();
}
[System.Xml.Serialization.XmlAttributeAttribute("sourcePath")]
public string SourcePath { get; set; }
[System.Xml.Serialization.XmlAttributeAttribute("archiveDestinationPath")]
public string ArchiveDestinationPath { get; set; }
[System.Xml.Serialization.XmlAttributeAttribute("databaseDestinationPath")]
public string DatabaseDestinationPath { get; set; }
public DeployRuns DeployRuns { get; set; }
}
И чтобы завершить пример кода, вот мой класс верхнего уровня для этой иерархии:
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlRootAttribute(ElementName = "ExecutionHistory", Namespace = "", IsNullable = false)]
public class ExecutionHistory
{
public ExecutionHistory()
{
this.CaptureDetails = new CaptureDetails();
this.DeployDetails = new DeployDetails();
}
[XmlElementAttribute("CaptureDetails", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public CaptureDetails CaptureDetails { get; set; }
[XmlElementAttribute("DeployDetails", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public DeployDetails DeployDetails { get; set; }