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

Best Practice for Serializing an XML Document from a Class

我目前的解决方案运行良好。我有一个 C# class Person,我正在使用 XmlSerializer 对象将其序列化为 XML 文档。我知道以下 class 结构将被序列化到 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 class 完全可以接受?

这样做或不这样做的含义是什么?

[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; }
}

XmlRoot 属性允许您在不更改 class 的名称的情况下控制元素的名称。

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

基本上怎么处理都无所谓。但是,对于我来说,当我有明确的 XML 序列化契约时,它看起来更具可读性——一种适合不带属性的序列化类型。但是,有时 XML 文档需要名称不适合 C# 语言的元素。命名规范,你必须使用属性:)

默认情况下,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 与众不同。如果您在所有项目上显式设置了属性,则不太明显必须以不同方式对其进行序列化。