【问题标题】:How to include properties with default values while serializing with XMLSerializer in c#如何在 C# 中使用 XMLSerializer 进行序列化时包含具有默认值的属性
【发布时间】:2018-06-28 09:46:39
【问题描述】:

默认情况下,XMLSerializer 在执行序列化时会忽略具有默认值的属性。但我确实有一个特殊情况,即无论默认值如何,每个属性都必须序列化。

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

确切地说,我无法删除DefaultValueAttribute,同时,我希望使用 XML 序列化程序对所有属性进行序列化。

提前致谢

【问题讨论】:

    标签: c# serialization xmlserializer


    【解决方案1】:

    第一种方式。

    创建一个数据传输对象。具有与原始类相同的一组属性,但没有 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);
    

    现在它将序列化默认值。

    【讨论】:

    • 第二种方法很有效。非常感谢。
    猜你喜欢
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多