using System.ComponentModel;
using System.IO;
using System.Xml.Serialization;
namespace SerializerTest {
static class Program {
static void Main() {
using (TextWriter textWriter = new StreamWriter("data.xml")) {
Data data = new Data();
new XmlSerializer(typeof(Data)).Serialize(textWriter, data);
textWriter.Close();
}
using (TextWriter textWriter = new StreamWriter("exData.xml")) {
ExData exData = new ExData();
new XmlSerializer(typeof(ExData)).Serialize(textWriter, exData);
textWriter.Close();
}
}
}
public class Data {
[DefaultValue(10)] public int A { get; set; }
public Data() { A = 10; }
}
public class ExData : Data {
[DefaultValue(20)] public new int A { get; set; }
public ExData() { A = 20; }
}
}
Хотя первая сериализация соответствует ожиданиям (не сериализация по умолчанию):
<?xml version="1.0" encoding="utf-8" ?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
второй результат:
<?xml version="1.0" encoding="utf-8"?>
<ExData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<A>20</A>
</ExData>
Очевидно, что XmlSerializer принимает значение по умолчанию базового класса, а не новый. Переопределение виртуального свойства с помощью «переопределения» дает тот же результат.
Изменение инициализации свойства ExData A на 10 приводит к тому, что это свойство не сериализуется, как будто применяется значение по умолчанию для свойства базового класса.
Кто-нибудь может объяснить мне это поведение?
Кто-нибудь знает обойти это?
Моя цель - не сериализовать значения по умолчанию, но изменить значение по умолчанию для производного класса.