C#Xml-使用IXmlSerializable对派生类进行序列化

maf*_*afu 7 c# xml serialization

我有一个与XML序列化兼容的基类和一个实现IXmlSerializable的派生类.

在此示例中,基类确实实现了IXmlSerializable:


using System.Diagnostics;
using System.Text;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace XmlSerializationDerived
{
    public class Foo
    {
        public int fooProp;

        public XmlSchema GetSchema()
        {
            return null;
        }

        public void ReadXml(XmlReader reader)
        {
            fooProp = int.Parse (reader.ReadElementString ("fooProp"));
        }

        public void WriteXml(XmlWriter writer)
        {
            writer.WriteElementString ("fooProp", fooProp.ToString ());
        }
    }

    public class Bar : Foo, IXmlSerializable
    {
        public new void ReadXml(XmlReader reader)
        {
            base.ReadXml (reader);
        }

        public new void WriteXml(XmlWriter writer)
        {
            base.WriteXml (writer);
        }

        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder ();
            XmlWriter writer = XmlWriter.Create (sb);

            Bar bar = new Bar ();
            bar.fooProp = 42;

            XmlSerializer serializer = new XmlSerializer (typeof (Bar));
            serializer.Serialize (writer, bar);

            Debug.WriteLine (sb.ToString ());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

<?xml version="1.0" encoding="utf-16"?><Bar><fooProp>42</fooProp></Bar>
Run Code Online (Sandbox Code Playgroud)

但是,我想使用一个实现IXmlSerializable 的基类.这可以防止使用base.Read/WriteXml.结果将是:

<?xml version="1.0" encoding="utf-16"?><Bar />
Run Code Online (Sandbox Code Playgroud)

还有什么方法可以得到理想的结果吗?

Mar*_*ell 4

“这会阻止使用 base.Read/WriteXml。”

通常,如果基类已实现IXmlSerializable,您可以将其设为一个virtual方法,以便使用具体版本。通常,您还可以使用显式实现(而不是公共属性) - 也许使用一些protected virtual实现细节的方法(尽管跟踪读取器/写入器在不同类中的位置将是一场噩梦)。

AFAIK,当您添加派生位时,无法重新使用XmlSerializer写入基本位。要么全有要么全无。IXmlSerializable