这些字段是否设置为默认值,就像创建新实例时一样?我可以创建自定义代码以在反序列化时将这些字段设置为新值吗?
最佳答案
注意:所有这些都是特定于 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
}
}
基于属性的回调提供了更多在特定点注入(inject)代码的机会,通常是首选。有 4 个:[OnDeserializing]
、[OnDeserialized]
、[OnSerializing]
和 [OnSerialized]
。
关于c# - 反序列化时标记为 [NonSerialized] 的字段会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12456571/