c# - 反序列化时标记为 [NonSerialized] 的字段会发生什么情况?

标签 c# deserialization

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

最佳答案

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

相关文章:

javascript - 如何在 WinRT C# 应用程序中执行 Javascript 代码?

javascript - 为什么我在 Controller 中得到一个为 0 的 int[] 元素,而 ajax 调用发送的是 null?

c# - 异常与返回码 : do we lose something (while gaining something else)?

c# - 反序列化时字典为空

javascript - 无法将多个参数绑定(bind)到请求的内容

c# - 无法将属性名称用作 dbset Entity Framework 的类名称

java - 如何从 Java 反序列化概念中声明为 transient 的文件中检索成员?

java - 使用较新的类从磁盘读取序列化的 java 对象?

c# - 反序列化类为空 - JSON C#

c# - 如何反序列化 XML 数组项?