使用屬性控制序列化行為

如果使用 [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] 來控制事物的寫法。