XmlSerialization в производных типах. Что не так?
От: WSN Россия  
Дата: 16.03.10 10:14
Оценка:
Здравствуйте!

Вопрос по Xml-сериализации. Странное поведение или где-то это документировано?

Тест:

Случай 1
    public class A
    {
        [XmlAttribute(AttributeName = "AField")]
        public string AField { get; set; }
    }
    public class B : A
    {
        public int BField { get; set; }
    }

Случай 2
    public class A1 : IXmlSerializable
    {
        public string AField { get; set; }

        #region Члены IXmlSerializable

        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }
        
        public void ReadXml(System.Xml.XmlReader reader)
        {
            throw new NotImplementedException();
        }

        public void WriteXml(System.Xml.XmlWriter writer)
        {
            writer.WriteAttributeString("AField", AField );
        }

        #endregion
    }
    public class B1 : A1
    {
        public int BField { get; set; }
    }


Вызов:

B obj = new B() {AField = "hello", BField = 1};
B1 obj1 = new B1() { AField = "hello", BField = 1 };
XmlSerializer s = new XmlSerializer(typeof(B));
XmlSerializer s1 = new XmlSerializer(typeof(B1));
var sb = new StringBuilder();
var w = new StringWriter(sb, System.Globalization.CultureInfo.InvariantCulture);
s.Serialize(w, obj);
sb.Append("\n");
s1.Serialize(w,obj1);
Console.Write(sb.ToString());
Console.Read();


Результат:


<?xml version="1.0" encoding="utf-16"?>
<B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" AField="hello">
  <BField>1</BField>
</B>
<?xml version="1.0" encoding="utf-16"?>
<B1 AField="hello" />


Ожидал, оба случая приведут к одинаковым результатам.
Что сделано не так, как исправить.
Инетересует комбинирование сериализиции. Т.е. в базовом реализовывать IXmlSerializable, а в производных чтобы была воможность сделать и так и так.
Нашел, что можно сделать следующее:


    public class A1 : IXmlSerializable
    {
        public string AField { get; set; }

        #region Члены IXmlSerializable

        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }
        
        public void ReadXml(System.Xml.XmlReader reader)
        {
            throw new NotImplementedException();
        }

        public void WriteXml(System.Xml.XmlWriter writer)
        {
            writer.WriteAttributeString("AField", AField );
        }

        #endregion
    }
    public class B1 : A1, IXmlSerializable
    {
        public int BField { get; set; }
        public new System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }
        
        public new void ReadXml(System.Xml.XmlReader reader)
        {
            throw new NotImplementedException();
        }

        public new void WriteXml(System.Xml.XmlWriter writer)
        {
            base.WriteXml(writer);
            writer.WriteElementString("BField", BField);
        }
    }

Но хотелось бы услышать про комбинированный вариант. Вообще это возможно или нет.


С уважением, Иван
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.