使用属性控制序列化行为

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