如何在 c# 中使用 XMLSerializer 序列化时包含具有默认值的属性
How to include properties with default values while serializing with XMLSerializer in c#
默认情况下,XMLSerializer
会在执行序列化时忽略具有默认值的属性。但我确实有一个特殊情况,无论默认值如何,每个 属性 都必须序列化。
同时,默认值属性还有其他用途,我无法删除 DefaultValueAttribute
。
准确地说,我无法删除 DefaultValueAttribute
,同时,我希望使用 XML 序列化程序对所有属性进行序列化。
提前致谢
第一种方式。
创建数据传输对象。具有与原始 class 相同的属性集,但没有 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);
现在它将序列化默认值。
默认情况下,XMLSerializer
会在执行序列化时忽略具有默认值的属性。但我确实有一个特殊情况,无论默认值如何,每个 属性 都必须序列化。
同时,默认值属性还有其他用途,我无法删除 DefaultValueAttribute
。
准确地说,我无法删除 DefaultValueAttribute
,同时,我希望使用 XML 序列化程序对所有属性进行序列化。
提前致谢
第一种方式。
创建数据传输对象。具有与原始 class 相同的属性集,但没有 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);
现在它将序列化默认值。