使用屬性控制序列化行為
如果使用 [NonSerialized]
屬性,則該成員在反序列化後將始終具有其預設值(對於 int
為 0,對於 string
為 null,對於 bool
為 false 等),無論物件本身是否進行任何初始化(建構函式) ,宣告等)。為了補償,提供了 [OnDeserializing]
(簡稱為反序列化)和 [OnDeserialized]
(稱為反序列化後)以及它們的對應物 [OnSerializing]
和 [OnSerialized]
的屬性。
假設我們想要向 Vector 新增一個 Rating
,我們希望確保值始終從 1 開始。下面寫的方式是反序列化後的 0:
[Serializable]
public class Vector
{
public int X;
public int Y;
public int Z;
[NonSerialized]
public decimal Rating = 1M;
public Vector()
{
Rating = 1M;
}
public Vector(decimal initialRating)
{
Rating = initialRating;
}
}
要解決此問題,我們只需在類中新增以下方法即可將其設定為 1:
[OnDeserializing]
void OnDeserializing(StreamingContext context)
{
Rating = 1M;
}
或者,如果我們想將其設定為計算值,我們可以等待它完成反序列化,然後設定它:
[OnDeserialized]
void OnDeserialized(StreamingContext context)
{
Rating = 1 + ((X+Y+Z)/3);
}
同樣,我們可以通過使用 [OnSerializing]
和 [OnSerialized]
來控制事物的寫法。