【问题标题】:Is it possible to deserialize xml to List object using .net provided serialization attributes?是否可以使用 .net 提供的序列化属性将 xml 反序列化为 List 对象?
【发布时间】:2010-01-29 18:14:55
【问题描述】:

我的 xml 输入看起来像(例如使用的简化版本):

<Student>
<Subject> History </Subject>
<Subject> English </Subject>
</Student>

有没有办法将上述 xml 反序列化为类如下所示的对象:

[Serializable]
[XmlRoot(ElementName = "Student", Namespace="")]
class Student
{
  public Student()
  {
    Subject = new List<string>();
  }

  public List<string> Subject {get;set;}

}

注意我想弄清楚这是否可以在不必实现 IXmlSerializable 接口的情况下完成,并且我想使用一个列表来存储 Subject 值(不是我知道的字符串 []可能是我使用 XmlElement 属性)。

【问题讨论】:

  • 有可能,您是否遇到错误?
  • brb,NetDataContractSerializer。

标签: c# serialization list


【解决方案1】:

使用XmlArrayAttribute 装饰主题属性。

[XmlArray]
public List<string> Subject { get; set; }

如果您需要省略 Subject 元素并在 Student 下方直接包含 Subject 条目,您可以简单地使用 [XmlElement] 属性:

[XmlElement]
public List<string> Subject { get; set; }

使用 Student 类对其进行序列化会产生类似于以下内容的输出:

<?xml version=\"1.0\" encoding=\"utf-16\"?>
<Student xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
    xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
    <Subject>History</Subject>
    <Subject>English</Subject>
</Student>"

【讨论】:

  • 您还可以为此使用列表吗?我认为它会引发错误,除非它序列化为数组。
  • 其实你是对的,“你也可以将它应用到返回ArrayList的集合和字段,或者任何返回实现IEnumerable接口的对象的字段。” msdn.microsoft.com/en-us/library/…
  • 根据文档,它适用于任何实现 IEnumerable 的东西。 IIRC,这是正确的,但已经有一段时间了......
  • 它不适用于 XmlArray 属性。我猜现在只是将其更改为数组并用 XmlElement 属性装饰字段...
  • 是的,它确实工作(我刚刚检查过),但我已经编辑了我的答案以包含更多选项。
猜你喜欢
  • 2010-10-11
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
相关资源
最近更新 更多