XML-сериализатор в C # - PullRequest
       3

XML-сериализатор в C #

1 голос
/ 03 июля 2011

Я использую XMLSerializer для загрузки некоторых объектов:

using (FileStream fileStream = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None))
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof (ModelDescriptor));
    modelDescriptor = (ModelDescriptor) xmlSerializer.Deserialize(fileStream);
}

Это загрузит объект ModelDescriptor с данными из файла XML. Тем не менее, как я могу загрузить несколько объектов таким образом? Я думаю, что мне понадобится цикл, но есть ли способ узнать заранее, сколько объектов есть? Я получаю InvalidOperationException, если я превышаю список, пытаясь загрузить объект из файла XML, которого там нет. Каков наилучший способ сделать это?

1 Ответ

3 голосов
/ 03 июля 2011

Если у вас есть несколько ModelDescriptor объектов в файле, для того, чтобы XML-файл был действительным, у вас должен быть один корневой элемент - что-то вроде:

<root>
   <ModelDescriptor>
       ....
   </ModelDescriptor>
   <ModelDescriptor>
      ....
   </ModelDescriptor>
</root>

В основном,вы бы создали фиктивный класс «контейнер», который, в свою очередь, содержит список ModelDescriptor объектов:

[XmlRoot(Namespace = "", IsNullable = false)]
public class root
{
    [XmlElement("ModelDescriptor", Form = XmlSchemaForm.Unqualified)]
    public List<ModelDescriptor> Items { get; set; }
}

public class ModelDescriptor
{
    public string Model { get; set; }
}

Теперь вы сможете десериализовать ваш файл в объект типа root иполучите ваши ModelDescriptors в списке Items:

FileStream fs = new FileStream(@"YourFileNameHere", FileMode.Open, FileAccess.Read);

XmlSerializer ser = new XmlSerializer(typeof(root));

var result = ser.Deserialize(fs); // would be an object of type "root" with the ModelDescriptor inside
...