C# 如何在c中使用XMLSerializer序列化时包含具有默认值的属性#

C# 如何在c中使用XMLSerializer序列化时包含具有默认值的属性#,c#,serialization,xmlserializer,C#,Serialization,Xmlserializer,默认情况下,XMLSerializer在执行序列化时将忽略具有默认值的属性。但我有一个特殊的情况,每个属性都必须序列化,而不考虑默认值 同时,默认值属性用于其他用途,我无法删除DefaultValueAttribute 确切地说,我不能删除DefaultValueAttribute,同时,我希望使用XML序列化程序序列化所有属性 先谢谢你第一条路 创建数据传输对象。使用与原始类相同的属性集,但没有DefaultValue属性 比如你有 public class Person { [Def

默认情况下,
XMLSerializer
在执行序列化时将忽略具有默认值的属性。但我有一个特殊的情况,每个属性都必须序列化,而不考虑默认值

同时,默认值属性用于其他用途,我无法删除
DefaultValueAttribute

确切地说,我不能删除
DefaultValueAttribute
,同时,我希望使用XML序列化程序序列化所有属性

先谢谢你

第一条路

创建数据传输对象。使用与原始类相同的属性集,但没有
DefaultValue
属性

比如你有

public class Person
{
    [DefaultValue(30)]
    public int Age { get; set; }
    public string Name { get; set; }
}
创造

public class PersonDto
{
    public int Age { get; set; }
    public string Name { get; set; }
}
像这样序列化:

var person = new Person { Age = 30, Name = "John" }; // original object

var personDto = new PersonDto { Age = person.Age, Name = person.Name }; // DTO

var xs = new XmlSerializer(typeof(PersonDto));
xs.Serialize(someStream, personDto);
当然,可以使用从一种对象类型到另一种对象类型的自动映射。像
AutoMapper


第二条路

使用
XmlAttributeOverrides

var person = new Person { Age = 30, Name = "John" };

var overrides = new XmlAttributeOverrides();
var attrs = new XmlAttributes();
attrs.XmlElements.Add(new XmlElementAttribute("Age"));
overrides.Add(typeof(Person), nameof(Person.Age), attrs);

var xs = new XmlSerializer(typeof(Person), overrides);
xs.Serialize(someStream, person);

现在,它将序列化默认值。

第二种方法就像一个符咒。谢谢。