SerializableAtttribute vs ISerializable

时间:2011-02-11 13:57:08

标签: c# cloning

我有扩展方法

 public static T DeepClone<T>(this T source) where T : ISerializable
 {
  ..
 }

当我添加“where T:ISerializable”时,我在使用具有[Serializable]属性的DeepClone()的所有类上都会出错。

  • 有什么问题?

修改

  • 我知道我的类应该实现ISerializable才能工作。但是,当使用ISerializable与[Serializable]?
  • 时序列化输出有什么不同吗?

4 个答案:

答案 0 :(得分:3)

有两种方法可以使类型可序列化。

  • 实施ISerializable(较少使用)
  • 应用[Serializable]属性(更多使用且更容易)

在您的情况下,您只考虑第一个。

要解决此问题,只需让序列化程序处理错误报告。它将为任何不可序列化的对象抛出错误。

答案 1 :(得分:2)

问题是分配属性(Serializable)与实现接口(ISerializable)没有任何共同之处。

答案 2 :(得分:2)

我想我会更多地回答这个问题。 [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()以自定义 如何序列化。< / p>

那么你如何以新的方式处理时髦的序列化呢?那么[Serializable]有一些合作伙伴,特别是[OnSerializing]和[OnDeserialized]。如果您需要执行与ISerializable.GetObjectData()相关的时髦序列化/反序列化,现在可以在事件中处理它。

我想指出两件事:

  1. 使用/实现ISerializable接口的原因不多(IMO,但可能是边缘情况)。只需使用较新的[Serializable]属性
  2. 即可
  3. 如果您觉得需要ISerializable,请记住您还必须将[Serializable]属性应用于您的班级。

答案 3 :(得分:1)

您必须将ISerializable接口添加到您的类

public class YourClass : ISerializable