gpt4 book ai didi

c# - 如何使 XmlSerializer 默认生成属性而不是元素

转载 作者:可可西里 更新时间:2023-11-01 07:58:45 25 4
gpt4 key购买 nike

有没有办法让 XmlSerializer 将原始类成员(例如字符串属性)序列化为 XML 属性,而不是 XML 元素,无需编写 每个属性声明前面的 [XmlAttribute]?IE。是否有全局开关告诉 XmlSerializer 将所有原始类成员序列化为 XML 属性?

假设我们有以下类:

public class Person
{
public string FirstName
{
...
}

public string LastName
{
...
}
}

然后XmlSerializer默认生成这段代码:

<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>

然而,我想要的是这段代码:

<Person FirstName="John" LastName="Doe"/>

再说一次:我想在没有 [XmlAttribute](或没有 XmlAttributeOverrides,这会更费事)的情况下做到这一点。

一种可能的解决方案是使用应用 XSLT 转换的通用后处理步骤将元素转换为属性。但我想知道是否有更简单的解决方案。

最佳答案

实现此目的的一种方法是在实现IXmlSerializable 的基类中实现序列化逻辑。接口(interface)。要序列化为 XML 的类必须从该基类派生才能获得功能。

举个例子

public class XmlSerializableEntity : IXmlSerializable
{
public XmlSchema GetSchema()
{
// Implementation omitted for clarity
}

public void ReadXml(XmlReader reader)
{
// Implementation omitted for clarity
}

public void WriteXml(XmlWriter writer)
{
var properties = from property in this.GetType().GetProperties()
where property.PropertyType.IsPrimitive ||
property.PropertyType == typeof(string)
select property;

foreach (var property in properties)
{
var name = property.Name;
var value = property.GetValue(this, null).ToString();
writer.WriteAttributeString(name, value);
}
}
}

这里我们使用 Reflection从当前对象中获取属性列表,其类型是原始类型或 String .然后使用提供的 XmlWriter 将这些属性作为属性写入 XML 输出。对象。

要序列化的类只需继承 XmlSerializableEntity 即可自动获得此行为:

[Serializable]
public class Foo : XmlSerializableEntity
{
public int Bar { get; set; }
}

关于c# - 如何使 XmlSerializer 默认生成属性而不是元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6932803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com