Как сериализовать коллекции в .net - PullRequest
4 голосов
/ 12 марта 2009

Я хочу сериализовать коллекцию объектов для хранения / извлечения из моего файла app.config. (Я использую код из примера из записи в блоге Джеффа Этвуда Обработчик раздела последней конфигурации. Пересмотрен ).

Что я хочу знать, почему коллекции объектов типа

public class MyClass
{
  ...
}

сериализуется в элемент xml с именем

<ArrayOfMyClass>...</ArrayOfMyClass> 

В этом примере я использую общий список объектов MyClass. Я также попытался создать новый класс, который наследуется от List, и результирующий xml точно такой же.

Есть ли способ переопределить имя элемента xml, используемое при сериализации / десериализации?

Ответы [ 3 ]

4 голосов
/ 12 марта 2009

Когда вы наследуете от List, вы можете попробовать что-то вроде

[Serializable]
[System.Xml.Serialization.XmlRoot("SuperDuperCollection")]
public class SuperDuperCollection : List<MyClass> { ... }

для украшения вашего класса, использование различных XmlAttributes должно позволить вам контролировать способ вывода XML при сериализации.

Просто дополнительное редактирование с некоторым тестовым кодом и выводом:

[Serializable]
public class MyClass
{
public int SomeIdentifier { get; set; }
public string SomeData { get; set; }
}

....

SuperDuperCollection coll = new SuperDuperCollection
{
    new MyClass{ SomeData = "Hello", SomeIdentifier = 1},
    new MyClass{ SomeData = "World", SomeIdentifier = 2}
};

Console.WriteLine(XmlSerializeToString(coll));

Выход:

<SuperDuperCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MyClass>
    <SomeIdentifier>1</SomeIdentifier>
    <SomeData>Hello</SomeData>
  </MyClass>
  <MyClass>
    <SomeIdentifier>2</SomeIdentifier>
    <SomeData>World</SomeData>
  </MyClass>
</SuperDuperCollection>
3 голосов
/ 12 марта 2009

Посмотрите на атрибут XmlArrayAttribute

3 голосов
/ 12 марта 2009

Это не так, если они являются дочерними элементами типа - вы можете использовать [XmlRoot], [XmlType], [XmlElement] и [XmlArray] и [XmlArrayItem] в различных комбинациях, чтобы получить разные результаты - к сожалению, особенности зависят от точного макета ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...