只是想我会对这个答案多一点。[Serializable] vs ISerializable 让我困惑了一段时间,我终于把它理顺了。
当您希望类可序列化时,您应用 [Serializable] 属性。这就是你所需要的(今天也是如此)。但是,有时您需要更好地控制序列化过程(可能序列化对象的接收者有一些您的对象不太关心的严格要求)。为了在 .NET 2.0 之前的日子里处理对象如何序列化的任何自定义,除了应用 [Serializable] 属性之外,您还实现了 ISerializable 接口。
ISerializable 接口有一个单一的功能要求:
void GetObjectData(SerializationInfo info,StreamingContext context)
在此函数中,您序列化了您的内容:
GetObjectData(SerializationInfo info,StreamingContext context)
{
// example of some type of customization of the serialization process, giving
// your serialized class member a custom name
info.AddValue("GiveMyDataMemberCustomNameInOutput", myDataMember);
...
随着一些额外的 [Serializable] 属性的出现(.NET 2.0),您无需实现 ISerializable.GetObjectData() 即可自定义某些内容的序列化方式。
那么如何以新的方式处理时髦的序列化呢?嗯,[Serializable] 有一些合作伙伴,特别是 [OnSerializing] 和 [OnDeserialized]。如果您需要执行以前使用 ISerializable.GetObjectData() 执行的时髦序列化/反序列化,您现在可以在事件中处理它。
我想指出两点:
- 没有太多理由(IMO,但可能是边缘情况)使用/实现 ISerializable 接口。只需使用较新的 [Serializable] 属性
- 如果您觉得需要 ISerializable,请记住您还必须将 [Serializable] 属性应用于您的类。