【问题标题】:What's the difference between using the Serializable attribute & implementing ISerializable?使用 Serializable 属性和实现 ISerializable 有什么区别?
【发布时间】:2011-01-22 20:04:43
【问题描述】:

使用Serializable 属性和实现ISerializable 接口有什么区别?

【问题讨论】:

标签: c# inheritance attributes serialization iserializable


【解决方案1】:

当您使用SerializableAttribute 属性时,您在编译时将属性放在字段上,这样在运行时,序列化工具将通过执行反射来知道基于属性序列化的内容类/模块/程序集类型。

[Serializable]
public class MyFoo { … }

上面表明序列化工具应该序列化整个类MyFoo,而:

public class MyFoo
{
    private int bar;

    [Serializable]
    public int WhatBar
    {
       get { return this.bar; }
    }
}

使用该属性可以选择性地选择需要序列化的字段。

当您实现ISerializable interface 时,通过覆盖GetObjectData SetObjectData(并提供MyFoo(SerializationInfo info, StreamingContext context) 形式的构造函数),序列化有效地被自定义版本覆盖,将对数据的序列化进行更精细的控制。

另见this example of a custom serialization here on StackOverflow。它展示了如何使序列化与序列化数据的不同版本保持向后兼容。

希望这会有所帮助。

【讨论】:

  • 在哪个版本的 .NET 中可以将 Serializable 属性添加到属性? MSDN 说它只能应用于类、结构、枚举和委托。
  • 无。可序列化属性不能应用于属性,只能应用于类、结构和枚举以及委托声明。
  • 恰恰相反:当类用SerializableAttribute装饰时,一个成员可以用NonSerializedAttribute标记被跳过,正如多人(和MSDN)所说,重建某个对象时在不同的环境中没有意义,明智的做法是不要序列化它......
【解决方案2】:

SerializableAttribute 指示框架执行默认的序列化过程。如果您需要更多控制,可以实现ISerializable interface。然后你可以把你自己的代码序列化到GetObjectData方法中,并更新传递给它的SerializationInfo对象。

【讨论】:

  • 如果实现ISerializable,也习惯(甚至可能需要)实现反序列化构造函数:protected SomeClass(SerializationInfo info, StreamingContext context)
  • 注意,即使你实现了ISerializable接口,你仍然需要标记类[Serializable]。
【解决方案3】:

ISerializable 接口允许您实现 自定义序列化 而非默认值。 实现ISerializable接口时,必须重写GetObjectData方法,如下

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}

【讨论】:

    【解决方案4】:

    ISerialize 强制你手动实现序列化逻辑,而通过 Serializable 属性标记(你是这个意思吗?)会告诉二进制序列化器这个类可以序列化。它会自动完成。

    【讨论】:

      【解决方案5】:

      从 ISerializable 继承允许您自定义实现(反)序列化。仅使用 Serializable 属性时,(反)序列化只能由属性控制,灵活性较差。

      【讨论】:

      • 反序列化是通过反序列化构造函数处理的。请参阅我对段错误答案的评论。
      猜你喜欢
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2021-12-26
      • 2015-09-10
      • 2010-10-23
      相关资源
      最近更新 更多