首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SerializableAtttribute对ISerializable

SerializableAtttribute对ISerializable
EN

Stack Overflow用户
提问于 2011-02-11 13:57:07
回答 4查看 845关注 0票数 1

我有延拓法

代码语言:javascript
复制
 public static T DeepClone<T>(this T source) where T : ISerializable
 {
  ..
 }

当我添加"where T: ISerializable“时,所有使用具有可序列化属性的DeepClone()类都会出错。

  • What是problem?

编辑:

  • 我知道我的类应该实现ISerializable才能工作。但是,在使用Serializable

和ISerializable时,序列化输出有什么不同吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-11 14:02:41

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

  • 实现ISerializable (少用)
  • 应用可序列化属性(更多使用更容易)

在你的例子中,你只考虑第一个。

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

票数 3
EN

Stack Overflow用户

发布于 2011-02-11 14:01:14

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

票数 2
EN

Stack Overflow用户

发布于 2014-04-14 23:52:03

我只想对这个答案再多说几句。可序列化的vs ISerializable让我困惑了一段时间,我终于把它弄清楚了。

当您希望类可序列化时,可以应用serializable属性。这就是你所需要的(今天也是如此)。但是,有时您需要更好地控制序列化过程(也许序列化对象的接收方有一些您的对象不那么关心的严格要求)。为了处理在.NET 2.0前如何序列化对象的任何定制,除了应用可序列化属性之外,还实现了ISerializable接口。

ISerializable接口有一个单一的功能要求:

代码语言:javascript
复制
void GetObjectData(SerializationInfo info,StreamingContext context)

在这个函数中,您序列化了内容:

代码语言:javascript
复制
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);
   ...

随着一些附加的可序列化属性的出现(.NET 2.0),您不需要实现ISerializable.GetObjectData()来定制某种东西是如何序列化的。

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

我想指出两件事:

  1. --使用/实现ISerializable接口的原因并不多(IMO,但可能是边缘情况)。如果您觉得需要
  2. ,只需使用较新的可序列化属性ISerializable,那么请记住,您还必须将可序列化属性应用于类.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4969816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档