有条件地使用IXmlSerializable接口方法

时间:2017-10-09 13:58:25

标签: c# .net xml-serialization xmlserializer ixmlserializable

我需要一种以这种方式自定义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也应该像这样。对象模型很复杂,因此按属性或逐个元素实现此属性对我来说不是一个选项。 可以这样做吗?

1 个答案:

答案 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; }
}

如果ElementXmlstring.Empty,则不会将其序列化。

你应该使用这样的代码:

private string _elementXml;

[DefaultValue("")]
public string ElementXml
{
    get => _elementXml;
    set => _elementXml = string.IsNullOrWhiteSpace(value) ? null : value;
}

在这种情况下,不仅不会将null或空序列化,还会序列化任何空格字符串。