首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ISerializable接口的意义是什么?

ISerializable接口的意义是什么?
EN

Stack Overflow用户
提问于 2009-05-01 10:56:29
回答 4查看 42.4K关注 0票数 58

似乎我可以序列化没有该接口的类,所以我不清楚它的用途。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-01 11:06:48

ISerializable用于提供定制的二进制序列化,通常用于BinaryFormatter (也可能用于远程处理)。如果没有它,它将使用字段,这些字段可以是:

委派效率低下;如果有些字段仅在运行时用于提高效率,但可以删除以进行序列化(例如,字典在执行serialized)

  • inefficient;时看起来可能会有所不同,即使对于需要的字段也是如此)。如果存在无法序列化的字段(例如事件委托,尽管可以将它们标记为[NonSerialized])

  • brittle;),则需要包含大量额外的委托。您的序列化现在绑定到字段名,但字段是用于实现的详细信息;另请参阅Obfuscation, serialization and automatically implemented properties

(

  • )。

通过实现ISerializable,您可以提供自己的二进制序列化机制。请注意,与此对应的xml是XmlSerializer等人使用的IXmlSerializable

出于DTO的目的,应该避免使用BinaryFormatter --像xml (通过XmlSerializerDataContractSerializer)或json这样的东西是好的,就像协议缓冲区这样的跨平台格式一样。

为了完整性,protobuf-net确实包含了用于ISerializable的钩子(允许您在不编写大量代码的情况下使用可移植的二进制格式),但是BinaryFormatter无论如何都不会是您的首选。

票数 73
EN

Stack Overflow用户

发布于 2009-05-01 11:04:31

可以通过以下两种方式之一在.NET中序列化类:

  1. SerializableAttribute标记类,并用NonSerialized属性修饰您不想序列化的所有字段。(正如Marc Gravell指出的那样,除非为完全自定义的serialization.

BinaryFormatter接口上特别标记了字段,否则通常用于格式化ISerializable对象的类BinaryFormatter会自动序列化所有字段

前者使用起来更简单,因为它只涉及用属性标记声明,但它的功能有限。后者允许更大的灵活性,但需要付出更多的努力才能实现。你应该使用哪一个完全取决于上下文。

关于后者(ISerializable)和它的用法,我引用了接口的MSDN page

任何可能被序列化的类都必须用SerializableAttribute标记。如果一个类需要控制它的序列化过程,它可以实现ISerializable接口。格式化程序在序列化时调用GetObjectData,并用表示对象所需的所有数据填充提供的SerializationInfo。格式化程序使用图形中的对象类型创建一个SerializationInfo。需要为自己发送代理的对象可以使用SerializationInfo上的FullTypeName和AssemblyName方法来更改传输的信息。

在类继承的情况下,可以序列化从实现ISerializable的基类派生的类。在这种情况下,派生类应该在其GetObjectData实现中调用GetObjectData的基类实现。否则,基类中的数据将不会被序列化。

票数 10
EN

Stack Overflow用户

发布于 2009-05-01 11:02:23

使用ISerializable,您可以在对象中编写自定义方法,以便在执行二进制序列化时接管序列化,以与BinaryFormatter使用的默认方法不同的方式序列化对象。

换句话说,如果默认方法序列化对象的方式不同于您希望它序列化为的方式,则可以实现ISerializable以实现完全控制。请注意,除了ISerializable之外,还有一个应该实现的自定义构造函数。

XmlSerialization当然只使用属性,而ISerializable与序列化无关。

感谢Marc和Pop的评论,我对我的第一个回答有点仓促。

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

https://stackoverflow.com/questions/810974

复制
相关文章

相似问题

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