1

我有扩展方法

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

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

  • 问题是什么?

编辑:

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

4 回答 4

3

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

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

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

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

于 2011-02-11T14:02:41.180 回答
2

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

于 2011-02-11T14:01:14.863 回答
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() 即可自定义某些内容的序列化方式。

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

我想指出两点:

  1. 没有太多理由(IMO,但可能是边缘情况)使用/实现 ISerializable 接口。只需使用较新的 [Serializable] 属性
  2. 如果您觉得需要 ISerializable,请记住您还必须将 [Serializable] 属性应用于您的类。
于 2014-04-14T23:52:03.740 回答
1

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

public class YourClass : ISerializable
于 2011-02-11T14:00:22.057 回答