有条件地序列化/反序列化属性

Kai*_*kus 5 c# xml serialization

我有一个类,其对象必须根据布尔值序列化/反序列化属性

[System.SerializableAttribute()]
public class Foo
{
    private string myField;
    private bool myFieldSerializes;

    //Parameterless construction for serializing purposes
    public Foo() { }

    public Foo(string myField, bool myFieldSerializes)
    {
        this.myField = myField;
        this.myFieldSerializes = myFieldSerializes;
    }

    public string MyField
    {
        get {return this.myField;}
        set {this.myField = value;}
    }

    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool MyFieldSerializes
    {
        get {return this.myFieldSerialzes;}
        set {this.myFieldSerialzes = value;}
    }
}
Run Code Online (Sandbox Code Playgroud)

它应该是这样工作的:

  • 如果我创建一个实例并将 myFieldSerializes 设置为“true”,则在序列化对象(使用 XMLSerialize)时,必须序列化 myField(包含在 XML 消息中)。如果设置为“false”,则应忽略它。

  • 反序列化(使用 XMLDeserialize)时,布尔值 myFieldSerializes 应该告诉我 myField 是否已被反序列化(换句话说,它存在于 XML 文件中)。

实现这种行为的方式是什么?

谢谢!:)

dbc*_*dbc 5

您的要求符合propertyNameSpecified的模式XmlSerializer。来自文档

如果架构包含可选元素...[一个]选项是使用特殊模式创建 XmlSerializer 识别的布尔字段,并将 XmlIgnoreAttribute 应用于该字段。该模式以propertyNameSpecified的形式创建。例如,如果有一个名为“MyFirstName”的字段,您还需要创建一个名为“MyFirstNameSpecified”的字段,指示 XmlSerializer 是否生成名为“MyFirstName”的 XML 元素。

这种模式的便利之处在于,除了记录的行为之外,在反序列化期间,如果遇到该属性,会将propertyNameSpecifiedXmlSerializer设置为 true ——这正是您所需要的。因此你的类应该是这样的:

public class Foo
{
    private string myField;
    private bool myFieldSerializes;

    //Parameterless construction for serializing purposes
    public Foo() { }

    public Foo(string myField, bool myFieldSerializes)
    {
        this.myField = myField;
        this.myFieldSerializes = myFieldSerializes;
    }

    [XmlElement(IsNullable = true)] // Emit a value even when null as long as MyFieldSpecified == true
    public string MyField
    {
        get { return this.myField; }
        set { this.myField = value; }
    }

    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool MyFieldSpecified { get { return myFieldSerializes; } set { myFieldSerializes = value; } }
}
Run Code Online (Sandbox Code Playgroud)

(添加[XmlElement(IsNullable = true)]MyField属性可确保在 时始终发出元素MyFieldSpecified == true,即使字段本身是null。)

原型小提琴