可能重复:
What's the difference between using the Serializable attribute & implementing ISerializable?
使用class标记Serializable
的内容是什么? e.g:
[Serializable]
public Hashtable
{
}
与实施class的ISerializable
有什么不同? e.g:
public Hashtable : ISerializable
{
}
与将class标记为Serializable并实施ISerializable
的方式有何不同? e.g:
[Serializable]
public Hashtable : ISerializable
{
}
[Serializable]
与ISerializable
相比,目的是什么?
tl; dr :什么是[Serializable]
?
答案 0 :(得分:14)
我以为你与Serializable相关联,但你没有:
默认情况下,类型中由
SerializableAttribute
标记的所有公共和私有字段都是序列化的,除非该类型实现ISerializable
接口以覆盖序列化过程。
和
应用
SerializableAttribute
属性,即使该类也实现了ISerializable
接口[...]
也就是说,Serializable
属性表示此类型可以被序列化。 ISerializable
表示此类型想要控制 此类型的序列化方式。
或者,换句话说,你的问题是用错误的方式表达的。 SerializableAttribute
应始终应用(可序列化的类),并且是序列化的“基本”级别。 ISerializable
增加了更多(通过允许您编写代码来控制流程)。
答案 1 :(得分:4)
ISerializable
表示您必须覆盖/实施方法void GetObjectData
[Serializable]
指令让编译器知道这个类可以被序列化。如果类不符合要求,CLR将抛出异常:即默认构造函数,未知类型等