Как включить свойства со значениями по умолчанию при сериализации с XMLSerializer в c # - PullRequest
0 голосов
/ 28 июня 2018

По умолчанию XMLSerializer будет игнорировать свойства со значениями по умолчанию при выполнении сериализации. Но у меня есть особый случай, когда каждое свойство должно быть сериализовано независимо от значений по умолчанию.

В то же время атрибуты значений по умолчанию служат другим целям, для которых я не могу удалить DefaultValueAttribute.

Если быть точным, я не могу удалить DefaultValueAttribute и в то же время хочу, чтобы все свойства были сериализованы с использованием XML-сериализатора.

Заранее спасибо

1 Ответ

0 голосов
/ 28 июня 2018

Первый путь.

Создать объект передачи данных. С тем же набором свойств, что и у исходного класса, но без атрибутов 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);

Теперь он будет сериализовать значение по умолчанию.

...