从类中序列化XML文档的最佳实践

时间:2015-12-10 21:36:14

标签: c# xml xml-serialization

我目前的解决方案工作正常。我有一个C#类Person,我使用XmlSerializer对象将其序列化为XML文档。我知道以下类结构将序列化为XML文档(也在下面)。

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    [XmlAttribute("recordId")]
    public int recordId { get; set; }
}

...将序列化为以下XML:

<?xml version="1.0" encoding="utf-8"?>
<Person recordId="1">
  <FirstName>John</FirstName>
  <LastName>Doe</LastName>
  <Age>32</Age>
</Person>

假设每个属性都相同我应该使用XmlElement标记明确地为每个元素添加前缀XmlAttribute;或者离开上面定义的Person类完全正确且可以接受?

这样做有什么意义呢?

[XmlRoot("Person")]
public class Person
{
    [XmlElement("FirstName")]
    public string FirstName { get; set; }
    [XmlElement("LastName")]
    public string LastName { get; set; }
    [XmlElement("Age")]
    public int Age { get; set; }
    [XmlAttribute("recordId")]
    public int recordId { get; set; }
}

3 个答案:

答案 0 :(得分:1)

默认情况下,XmlSerializer使用XML元素名称的属性名称,并使用99%的时间。边缘情况是您需要将自定义元素名称映射到属性名称的位置(例如,您从XML中创建代码模型,而XML元素以无效字符开头)。

对我来说,明确地装饰它们只是代码臃肿。如果默认名称正确,则让XmlSerializer使用名称执行默认操作。很少(不赞成)的情况下,显式修饰名称会让您更改基础属性名称而不会破坏序列化,但如果必须这样做,那么您可以在那时添加属性。

因此,只要结果合适,我就会将它们留下来,并且仅添加它们以表示某些特定属性不同。例如,您提供了代码:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    [XmlAttribute("recordId")]
    public int recordId { get; set; }
}

这会立即引起recordId的注意。如果您在所有项目上明确设置了属性,则不太明显它必须以不同方式进行序列化。

答案 1 :(得分:0)

XmlRoot属性允许您控制元素的名称而不更改类的名称。

如果类名与XML元素名相同,则无需包含它。

答案 2 :(得分:0)

基本上,如何处理它并不重要。但是,对于我来说,当我有明确的XML序列化契约时,它看起来更具可读性 - 一种适用于没有属性的序列化的类型。但是,有时XML文档需要名称不适合C#lang的元素。命名规范,你必须使用属性:)