Почему XMLSerializer принимает атрибут DefaultValue базового класса для сериализации - PullRequest
2 голосов
/ 08 октября 2009
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 приводит к тому, что это свойство не сериализуется, как будто применяется значение по умолчанию для свойства базового класса. Кто-нибудь может объяснить мне это поведение? Кто-нибудь знает обойти это?

Моя цель - не сериализовать значения по умолчанию, но изменить значение по умолчанию для производного класса.

1 Ответ

1 голос
/ 08 октября 2009

Кажется, что XmlSerializer получает только первое DefaultValueAttribute, и я, к сожалению, думаю, что нет прямого обхода того, что вам нужно. Однако вы можете реализовать IXmlSerializable и делать подобные вещи самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...