【问题标题】:What does the [Serializable] attribute do that ISerializable doesn't? [duplicate][Serializable] 属性有什么 ISerializable 没有的功能? [复制]
【发布时间】:2011-12-21 19:03:39
【问题描述】:

可能重复:
What's the difference between using the Serializable attribute & implementing ISerializable?

Serializable 标记class 有什么作用?例如:

[Serializable]
public Hashtable 
{
}

它与实现ISerializableclass 有何不同?例如:

public Hashtable : ISerializable
{
}

与将class标记为Serializable并实现ISerializable有何不同?例如:

[Serializable]
public Hashtable : ISerializable
{
}

[Serializable] 相对于ISerializable 的用途是什么?

tl;dr[Serializable] 是什么?

【问题讨论】:

  • 来自你自己的链接:“如果一个类需要控制它的序列化过程,它可以实现ISerializable接口”
  • @BFree "上面表明序列化工具应该序列化整个类 'MyFoo' 而......" ...而......而......什么?

标签: c# .net serialization


【解决方案1】:

我以为你链接到 Serializable,但你没有:

一个类型中所有被SerializableAttribute标记的公共和私有字段都默认被序列化,除非该类型实现了ISerializable接口来覆盖序列化过程。

和,

应用SerializableAttribute 属性,即使该类也实现了ISerializable 接口[...]

Serializable属性表示该类型可以被序列化。 ISerializable 表示这个类型想要控制如何这个类型被序列化。


或者,换句话说,您的问题的措辞是错误的。 SerializableAttribute 应该始终应用(可序列化的类),并且是序列化的“基本”级别。 ISerializable 增加了更多(通过允许您编写代码来控制进程)。

【讨论】:

  • 如果您将某个类型中的某个公共或私有字段标记为[Serializable] 而不是其他字段,这意味着什么?这不是荒谬的吗?
  • @IanBoyd - 如果你设法用它标记一个字段,并且它编译,这意味着你的编译器没有遵循属性使用提示,它被声明为仅适用于类、结构、委托和枚举。
  • 哦……所以一个类可以序列化,甚至不需要实现ISerializable。棘手!
【解决方案2】:

ISerializable 表示你必须重写/实现方法void GetObjectData

[Serializable] 指令让编译器知道这个类可以被序列化。如果类不满足要求,CLR会抛出异常:即默认构造函数、未知类型等

【讨论】:

    猜你喜欢
    • 2011-01-22
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多