看来我可以序列化没有该接口(interface)的类,所以我不清楚它的用途。

最佳答案

ISerializable用于提供自定义二进制序列化,通常用于BinaryFormatter(并可能用于远程处理)。没有它,它将使用以下字段:

  • 低效;如果存在仅在运行时用于提高效率的字段,但可以将其删除以进行序列化(例如,序列化时字典可能看起来有所不同)
  • 低效;甚至对于需要的字段,它也需要包含许多其他元数据
  • 无效;如果存在不能序列化的字段(例如事件委托(delegate),尽管可以将它们标记为[NonSerialized]),则为
  • 易碎;现在,您的序列化已绑定(bind)到字段名称-但字段应作为实现细节;另请参阅Obfuscation, serialization and automatically implemented properties

  • 通过实现ISerializable,您可以提供自己的二进制序列化机制。请注意,它的xml等效项是IXmlSerializable,由XmlSerializer等使用。

    出于DTO的目的,应避免使用BinaryFormatter-诸如xml(通过XmlSerializerDataContractSerializer)或json之类的东西是不错的,跨平台格式(如 Protocol Buffer )也是如此。

    为了完整起见,protobuf-net确实包括ISerializable的钩子(Hook)(允许您使用可移植的二进制格式而无需编写大量代码),但是BinaryFormatter绝对不是您的首选。

    10-04 13:05