这些字段是否设置为默认值,例如创建新实例时?我可以创建自定义代码以在反序列化时将这些字段设置为新值吗?
答案 0 :(得分:6)
注意:所有这些都特定于BinaryFormatter
:
默认情况下,它们会被完全忽略;它们将具有类型默认值,即零值/空值。
如果您实施自定义序列化(ISerializable
),则[NonSerializable]
不适用,您可以执行您想要的操作,但大多数人不希望必须这样做。但是,您也可以实现IDeserializationCallback
,这为初始化此类字段提供了理想的机会:
[Serializable]
class Foo : IDeserializationCallback
{
// ... not shown
void IDeserializationCallback.OnDeserialization(object sender)
{
// init your [NonSerialized] fields here
}
}
请注意,其他序列化程序具有不同的实现序列化回调,其中一些也支持BinaryFormatter
,例如:
[Serializable]
class Foo
{
// ... not shown
[OnDeserializing]
private void AnyMethodName(StreamingContext c)
{
// init your [NonSerialized] fields here
}
}
基于属性的回调提供了在特定点注入代码的更多机会,通常是首选。有4个:[OnDeserializing]
,[OnDeserialized]
,[OnSerializing]
和[OnSerialized]
。
答案 1 :(得分:0)
创建新实例时,此字段是类型的默认值。
您可以在对象构造
上设置自定义值