0

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

4

1 回答 1

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 或空,也不会序列化任何空白字符串。

于 2017-10-09T16:46:45.227 回答