如何在.NET中序列化集合

4
我希望能够将一组对象序列化,以便从我的app.config文件中进行存储和检索。(我正在使用Jeff Attwood博客文章The Last Configuration Section Handler.. Revisited中的示例代码)。
我想知道的是,为什么类型为
public class MyClass
{
  ...
}

被序列化为名为xml元素的

<ArrayOfMyClass>...</ArrayOfMyClass> 

在这个例子中,我正在使用MyClass对象的通用列表。我还尝试创建一个继承自List的新类,结果生成的xml完全相同。是否有一种方法可以在序列化/反序列化时覆盖使用的xml元素名称?

更新了我的回答,提供了一个非常简单的解决方案。 - eglasius
3个回答

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>

你可以不用额外的类,看看我的更新答案。 - eglasius

3

如果它们是某种类型的子元素,那么就不需要 - 您可以使用[XmlRoot], [XmlType], [XmlElement][XmlArray]以及[XmlArrayItem]的各种组合来获得不同的结果 - 不幸的是,具体方案取决于确切的布局...


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接