首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件序列化/反序列化属性

条件序列化/反序列化属性
EN

Stack Overflow用户
提问于 2015-12-16 21:24:45
回答 3查看 4.4K关注 0票数 5

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

代码语言:javascript
复制
[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是否已经反序列化(换句话说,它存在于myField文件中)。

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

谢谢!:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-16 21:52:01

您的需求与propertyNameSpecified模式的XmlSerializer相匹配。来自文档

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

这种模式的方便之处在于,在反序列化过程中,除了文档记录的行为之外,如果遇到属性,XmlSerializer将将propertyNameSpecified设置为true --这正是您所需要的。因此,您的类应该如下所示:

代码语言:javascript
复制
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。)

原型小提琴

票数 5
EN

Stack Overflow用户

发布于 2015-12-16 21:32:47

似乎您可以使用ShouldSerialize方法:

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

代码语言:javascript
复制
public bool ShouldSerializeMyField() 
{
      return this.myFieldSerializes;
}
票数 1
EN

Stack Overflow用户

发布于 2015-12-16 21:42:52

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

因此,您需要实现如下所示的GetObjectData方法:

代码语言:javascript
复制
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
    // Use the AddValue method to specify serialized values.
    info.AddValue("props", myProperty_value, typeof(string));

}

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

代码语言:javascript
复制
// 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));
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34322386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档