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)
还有什么方法可以得到理想的结果吗?
“这会阻止使用 base.Read/WriteXml。”
通常,如果基类已实现IXmlSerializable
,您可以将其设为一个virtual
方法,以便使用具体版本。通常,您还可以使用显式实现(而不是公共属性) - 也许使用一些protected virtual
实现细节的方法(尽管跟踪读取器/写入器在不同类中的位置将是一场噩梦)。
AFAIK,当您添加派生位时,无法重新使用XmlSerializer
写入基本位。要么全有要么全无。IXmlSerializable