使用属性控制序列化行为
如果使用 [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]
来控制事物的写法。