我的问题很简单。
想象一下,我们有一个Foo类。并拥有T属性。
public class Foo<T>
{
public T Property { get; set; }
}
我想在其中实现IXmlSerializable,我的问题是我不知道模仿标准的XmlSerialization。我真的不知道如何像标准XmlSerlalization那样编写这个属性。
更新:我做了这个并且它无法正常工作
public class Foo<T> : IFoo
where T : IXmlSerializable
{
public T Value { get; set; }
}
public class FooA : Foo<string> { }
public class FooB : Foo<int> { }
public class FooC : Foo<List<Double>> { }
当我序列化这个类(A,B和C)时。我想要这样的事情:
使用头等舱:
<FooA>
<Value>StringDemo</Value>
</FooA>
使用第二课:
<FooB>
<Value>2</Value>
</FooB>
使用第三类:
<FooC>
<Value>
<ArrayOfDouble xsi:..>
<Double>3.1416</Double>
<Double>4.2</Double>
</ArrayOfDouble>
</Value>
</FooC>
这样的东西就是我想要的,我不想在所有这些自定义XmlSerializer中实现,我的意思是标准序列化使用的默认值。
答案 0 :(得分:1)
您需要在Foo<T>
和T(使用where T : IXmlSerializable
中实现IXmlSerializable。Foo<T>
中的实现将负责编写包含类型信息的包装元素(在WriteXml中)并在T上调用WriteXml
,然后从类型信息(ReadXml)重新创建实例,并在T上调用ReadXml
。
String
和Double
等基本类型不是IXmlSerializable
,因此如果您想支持它们,则无法where T : IXmlSerializable
。您还可以提供ReadXml
和WriteXml
的默认实施。这是有效的,因为您需要在致电Foo<T>
之前创建ReadXml
,强制您了解T
。
public class Foo<T> : IXmlSerializable {
public T Value { get; set; }
XmlSchema IXmlSerializable.GetSchema() {
return GetSchema();
}
protected virtual XmlSchema GetSchema() {
return null;
}
public virtual void ReadXml(XmlReader reader) {
reader.ReadStartElement();
var xmlSerializer = new XmlSerializer(typeof(T));
Value = (T)xmlSerializer.Deserialize(reader);
reader.ReadEndElement();
}
public virtual void WriteXml(XmlWriter writer) {
var xmlSerializer = new XmlSerializer(typeof(T));
xmlSerializer.Serialize(writer, Value);
}
}