我需要一种以这种方式自定义C#XML(de)序列化机制的方法:
[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也应该像这样。对象模型很复杂,因此按属性或逐个元素实现此属性对我来说不是一个选项。 可以这样做吗?
答案 0 :(得分:0)
考虑使用System.ComponentModel.DefaultValue
属性。
public class MyElement
{
[XmlAttribute]
public string PropertyX { get; set; }
[XmlElement]
public MySubElement SubElement { get; set; }
[DefaultValue("")]
public string ElementXml { get; set; }
}
如果ElementXml
为string.Empty
,则不会将其序列化。
你应该使用这样的代码:
private string _elementXml;
[DefaultValue("")]
public string ElementXml
{
get => _elementXml;
set => _elementXml = string.IsNullOrWhiteSpace(value) ? null : value;
}
在这种情况下,不仅不会将null或空序列化,还会序列化任何空格字符串。