如何在.net中序列化集合

时间:2009-03-12 16:02:21

标签: .net serialization

我想从app.config文件序列化一组对象以进行存储/检索。 (我正在使用Jeff Attwood的博客文章The Last Configuration Section Handler.. Revisited中的示例代码。)

我想知道的是为什么

类型的对象的集合
public class MyClass
{
  ...
}

被序列化为名为

的xml元素
<ArrayOfMyClass>...</ArrayOfMyClass> 

在这个例子中,我使用的是MyClass对象的通用列表。我也尝试创建一个继承自List的新类,结果xml完全相同。

有没有办法覆盖序列化/反序列化时使用的xml元素名称?

3 个答案:

答案 0 :(得分:4)

当你从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>

答案 1 :(得分:3)

如果它们是某种类型的子元素,则它们不会 - 您可以使用[XmlRoot][XmlType][XmlElement][XmlArray]以及[XmlArrayItem]组合得到不同的结果 - 不幸的是,细节取决于确切的布局......

答案 2 :(得分:3)

查看XmlArrayAttribute属性