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

本文关键字:最佳 文档 序列化 XML | 更新日期: 2023-09-27 18:26:30

我目前的解决方案运行良好。我有一个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>

假设每个属性都相同。我应该像用XmlAttribute一样,用XmlElement标记适当地显式地为每个元素加序吗;还是让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; }
}

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

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

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

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

基本上,如何处理它并不重要。但是,对我来说,当我有明确的XML序列化约定时,它看起来更可读——这是一种适合在没有属性的情况下进行序列化的类型。然而,有时XML文档需要具有不适合C#语言命名规范的名称的元素,并且您必须使用属性:)