反序列化时标记的字段会发生什么?
这些字段是否设置为默认值,例如创建新实例时? 我可以创建自定义代码以在反序列化时将这些字段设置为新值吗?
注意:所有这些都特定于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]
。
在创建新实例时,此字段是类型的默认值。
您可以在对象构造上设置自定义值