[英]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文件中)。
實現此行為的方法是什么?
謝謝! :)
您的要求與XmlSerializer
的propertyNameSpecified模式匹配。 來自文檔 :
如果模式包含一個可選的元素...... [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));
}
和一個構造函數,它將SerializationInfo
和StreamingContext
作為參數
// 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.