ISizableizable没有[Serializable]属性做什么?

时间:2011-12-21 19:03:39

标签: c# .net serialization

  

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

使用class标记Serializable的内容是什么? e.g:

[Serializable]
public Hashtable 
{
}

与实施classISerializable有什么不同? e.g:

public Hashtable : ISerializable
{
}

与将class标记为Serializable并实施ISerializable的方式有何不同? e.g:

[Serializable]
public Hashtable : ISerializable
{
}

[Serializable]ISerializable相比,目的是什么?

tl; dr :什么是[Serializable]

2 个答案:

答案 0 :(得分:14)

我以为你与Serializable相关联,但你没有:

  

默认情况下,类型中由SerializableAttribute标记的所有公共和私有字段都是序列化的,除非该类型实现ISerializable接口以覆盖序列化过程。

  

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

也就是说,Serializable属性表示此类型可以被序列化。 ISerializable表示此类型想要控制 此类型的序列化方式。


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

答案 1 :(得分:4)

ISerializable表示您必须覆盖/实施方法void GetObjectData

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