从 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
与众不同。如果您在所有项目上显式设置了属性,则不太明显必须以不同方式对其进行序列化。
我目前的解决方案运行良好。我有一个 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
与众不同。如果您在所有项目上显式设置了属性,则不太明显必须以不同方式对其进行序列化。