似乎我可以序列化没有该接口的类,所以我不清楚它的用途。
发布于 2009-05-01 11:06:48
ISerializable用于提供定制的二进制序列化,通常用于BinaryFormatter (也可能用于远程处理)。如果没有它,它将使用字段,这些字段可以是:
委派效率低下;如果有些字段仅在运行时用于提高效率,但可以删除以进行序列化(例如,字典在执行serialized)
[NonSerialized])
(
通过实现ISerializable,您可以提供自己的二进制序列化机制。请注意,与此对应的xml是XmlSerializer等人使用的IXmlSerializable。
出于DTO的目的,应该避免使用BinaryFormatter --像xml (通过XmlSerializer或DataContractSerializer)或json这样的东西是好的,就像协议缓冲区这样的跨平台格式一样。
为了完整性,protobuf-net确实包含了用于ISerializable的钩子(允许您在不编写大量代码的情况下使用可移植的二进制格式),但是BinaryFormatter无论如何都不会是您的首选。
发布于 2009-05-01 11:04:31
可以通过以下两种方式之一在.NET中序列化类:
SerializableAttribute标记类,并用NonSerialized属性修饰您不想序列化的所有字段。(正如Marc Gravell指出的那样,除非为完全自定义的serialization.在BinaryFormatter接口上特别标记了字段,否则通常用于格式化ISerializable对象的类BinaryFormatter会自动序列化所有字段
前者使用起来更简单,因为它只涉及用属性标记声明,但它的功能有限。后者允许更大的灵活性,但需要付出更多的努力才能实现。你应该使用哪一个完全取决于上下文。
关于后者(ISerializable)和它的用法,我引用了接口的MSDN page:
任何可能被序列化的类都必须用SerializableAttribute标记。如果一个类需要控制它的序列化过程,它可以实现ISerializable接口。格式化程序在序列化时调用GetObjectData,并用表示对象所需的所有数据填充提供的SerializationInfo。格式化程序使用图形中的对象类型创建一个SerializationInfo。需要为自己发送代理的对象可以使用SerializationInfo上的FullTypeName和AssemblyName方法来更改传输的信息。
在类继承的情况下,可以序列化从实现ISerializable的基类派生的类。在这种情况下,派生类应该在其GetObjectData实现中调用GetObjectData的基类实现。否则,基类中的数据将不会被序列化。
发布于 2009-05-01 11:02:23
使用ISerializable,您可以在对象中编写自定义方法,以便在执行二进制序列化时接管序列化,以与BinaryFormatter使用的默认方法不同的方式序列化对象。
换句话说,如果默认方法序列化对象的方式不同于您希望它序列化为的方式,则可以实现ISerializable以实现完全控制。请注意,除了ISerializable之外,还有一个应该实现的自定义构造函数。
XmlSerialization当然只使用属性,而ISerializable与序列化无关。
感谢Marc和Pop的评论,我对我的第一个回答有点仓促。
https://stackoverflow.com/questions/810974
复制相似问题