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

有帮助吗?

解决方案

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

  • 效率低下;如果有一些字段仅用于运行时提高效率,但可以在序列化时删除(例如,字典在序列化时可能看起来不同)
  • 效率低下;即使对于需要的字段,它也需要包含许多额外的元数据
  • 无效的;如果有字段 不能 被序列化(例如事件委托,尽管它们可以被标记为 [NonSerialized])
  • 脆;您的序列化现在绑定到 场地 名称 - 但字段意味着实现细节;也可以看看 混淆、序列化和自动实现的属性

通过实施 ISerializable 您可以提供自己的二进制序列化机制。请注意,与此等效的 xml 是 IXmlSerializable, ,如所使用的 XmlSerializer ETC。

出于 DTO 目的, BinaryFormatter 应该避免 - 像 xml 这样的东西(通过 XmlSerializer 或者 DataContractSerializer) 或 json 都很好,跨平台格式(如协议缓冲区)也很好。

为了完整起见,protobuf-net 确实包含以下钩子 ISerializable (允许您使用可移植的二进制格式而无需编写大量代码),但是 BinaryFormatter 无论如何,这不会是你的第一选择。

其他提示

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

  1. 使用 SerializableAttribute 标记类,并使用 NonSerialized 属性装饰您想要序列化的所有字段。 (正如Marc Gravell指出的那样, BinaryFormatter ,这是通常用于格式化 ISerializable 对象的类,它会自动序列化所有字段,除非它们被特别标记为其他字段。)
  2. 实现 ISerializable 接口以实现完全自定义序列化。
  3. 前者更易于使用,因为它只涉及使用属性标记声明,但功能有限。后者允许更大的灵活性,但需要更多的努力来实现。你应该使用哪一个完全取决于上下文。

    关于后者( ISerializable )及其用法,我引用了 MSDN页面

      

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

         

    在类继承的情况下,它   可以序列化一个类   派生自一个基类   实现ISerializable。在这   case,派生类应该调用   。的基类实现   其中的GetObjectData   GetObjectData的实现。   否则,来自基地的数据   class不会被序列化。

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

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

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

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

为了使对象“可传输”,您必须序列化它。例如,如果要使用.NET Remoting或Web服务传输对象数据,则必须提供序列化对象数据的方法,将对象实例减少为表示对象的高保真表示的可传输格式。

然后,您还可以使用序列化表示形式,将其传输到另一个上下文(例如不同的计算机),然后重建原始对象。

实现 ISerializable 接口时,类必须提供接口中包含的GetObjectData方法,以及专门接受两个参数的专用构造函数:SerializationInfo的实例,以及StreamingContext的一个实例。

如果您的类不需要对其对象状态进行细粒度控制,那么您可以使用 [Serializable] 属性。需要更多控制序列化过程的类可以实现ISerializable接口。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top