Search code examples
c#serializationxmlserializer

How to include properties with default values while serializing with XMLSerializer in c#


By default, the XMLSerializer will ignore the properties with default values while performing the serialization. But I do have a special case where every property has to be serialized irrespective of the default values.

At the same time, default value attributes are serving other purposes for which I cannot remove the DefaultValueAttribute.

To be precise, I cannot remove the DefaultValueAttribute and at the same time, I want all the properties to be serialized using XML serializer.

Thanks in advance


Solution

  • First way.

    Create a data transfer object. With the same set of properties as the original class, but without the DefaultValue attributes.

    For example you have

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

    Create

    public class PersonDto
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }
    

    Serialize like this:

    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);
    

    Of course, you can use automatic mapping from one object type to another. Like AutoMapper.


    Second way.

    Use 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);
    

    Now it will serialize default value.