繁体   English   中英

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

[英]Conditionally serialize/deserialize attribute

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

[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;}
    }
}

这是它应该如何工作:

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

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

实现此行为的方法是什么?

谢谢! :)

您的要求与XmlSerializerpropertyNameSpecified模式匹配。 来自文档

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

这种模式的方便之处在于,除了记录的行为之外,在反序列化期间,如果遇到属性XmlSerializer会将propertyNameSpecified设置为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; } }
}

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

原型小提琴

似乎你可以使用ShouldSerialize方法:

https://msdn.microsoft.com/en-us/library/53b8022e(v=vs.110).aspx

public bool ShouldSerializeMyField() 
{
      return this.myFieldSerializes;
}

您可以实现ISerializable接口,该接口允许您指定要序列化和反序列化的内容。

因此,您需要实现一个GetObjectData方法,如:

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
    // Use the AddValue method to specify serialized values.
    info.AddValue("props", myProperty_value, typeof(string));

}

和一个构造函数,它将SerializationInfoStreamingContext作为参数

// The special constructor is used to deserialize values.
public Foo(SerializationInfo info, StreamingContext context)
{
    // Reset the property value using the GetValue method.
    myProperty_value = (string) info.GetValue("props", typeof(string));
}

通过这种方式,您可以在序列化和反序列化期间决定要做什么(例如,设置属性的值,或者......)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM