【发布时间】:2017-10-09 13:58:24
【问题描述】:
我需要一种以这种方式自定义C# XML(反)序列化机制的方法:
[Serializable]
public class MyElement : IXmlSerializable
{
[XmlAttribute]
public string PropertyX { get; set; }
[XmlElement]
public MySubElement SubElement { get; set; }
// .... other properties and elements...
[XmlIgnore]
public string ElementXml { get;set; }
public XmlSchema GetSchema() { return null; }
public void ReadXml(XmlReader reader)
{
// use default deserialization mechanism, like IXmlSerializable isn't implemented
}
public void WriteXml(XmlWriter writer)
{
if (!string.IsNullOrEmpty(ElementXml)) {
// serialize as ElementXml value
}
else
{
// serialize using default serialization mechanism, like IXmlSerializable isn't implemented
}
}
}
我需要在多个元素上使用这个范例,例如 MySubElement 也应该像这样。对象模型很复杂,因此按属性或按元素实现此属性对我来说不是一个选项。 这个可以吗?
【问题讨论】:
-
在某些时候你必须以某种方式做到这一点,另见stackoverflow.com/questions/1495716/net-xmlignore-by-default
-
在填充
ElementXml的情况下,其他成员如PropertyX是否有默认(空)值? -
@dbc 如果可以解决问题,我可以让它们具有默认值。
-
那么您可能会考虑使用不同的架构。您可以拥有
[XmlAnyElement] public XmlNode [] ElementXml { get; set; }属性,而不是IXmlSerializable。如果所有其他属性都是null(空引用类型或可空值类型),那么XmlSerializer默认不会序列化它们,只有你的ElementXml会被序列化。 -
还有
[XmlAnyAttribute] public XmlAttribute[] XAttributes { get; set; }用于发射MyElement的任意属性。
标签: c# .net xml-serialization xmlserializer ixmlserializable