Здравствуйте!
Вопрос по 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);
}
}
Но хотелось бы услышать про комбинированный вариант. Вообще это возможно или нет.
С уважением, Иван