2015-12-16 124 views
2

我有一個類,它的對象必須序列化/反序列化依賴於一個布爾值有條件序列化/反序列化屬性

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

這是應該如何工作的屬性:

  • 如果我創建當序列化對象(使用XMLSerialize)時,必須將myField序列化(包含在XML消息中),並將myFieldSerializes設置爲'true'。如果設置爲'假',則應該忽略。

  • 當反序列化(使用XMLDeserialize)時,布爾myFieldSerializes應告訴我myField是否已反序列化(換句話說,它存在於XML文件中)。

實施此行爲的方法是什麼?

謝謝! :)

+0

我不完全清楚你想如何工作,但[XmlAttributre.XmlIgnore]的示例代碼(https://msdn.microsoft.com/en-us/library/system.xml.serialization。 xmlattributes.xmlignore(v = vs.110).aspx)可能是你想要的。 –

+0

查看相似回答http://stackoverflow.com/a/31015970/881798 – vendettamit

回答

2

您的要求匹配propertyName指定的模式XmlSerializer。從docs

如果模式包含可選的元素... [一]選擇是使用一種特殊的模式創建由XmlSerializer的認可布爾字段,並以XmlIgnoreAttribute適用於現場。該模式以propertyName指定的的形式創建。例如,如果有一個名爲「MyFirstName」的字段,則還會創建一個名爲「MyFirstNameSpecified」的字段,該字段指示XmlSerializer是否生成名爲「MyFirstName」的XML元素。

什麼是便利這個模式是,超越記錄的行爲,反序列化過程中,XmlSerializerpropertyNameSpecified設置爲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。)

原型fiddle

+1

哇,很酷的發現...給了你一個upvote ;-) –

+0

謝謝!事實上,這就是我所處的確切情況:XSD文件中的一個可選屬性,xsd.exe工具轉換爲'propertyName'和一個布爾'propertyNameSpecified'。我以爲我不得不手動控制序列化,但我看到序列化器一切工作:) – Kaikus

0

你可以實現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)); 
} 

通過這種方式,你可以在序列化過程決定和反序列化做什麼(例如設置屬性的值或不...,)

相關問題