繁体   English   中英

反序列化时,标记为[NonSerialized]的字段会怎样?

[英]What happens to fields you mark [NonSerialized] when you deserialize?

这些字段是否设置为默认值(例如在创建新实例时)? 我可以创建自定义代码以在反序列化时将这些字段设置为新值吗?

注意:所有这些都是特定于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]

创建新实例时,此字段是type的默认值。

您可以在对象构造上设置设置自定义值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM