代码之家  ›  专栏  ›  技术社区  ›  FosterZ

序列化的目的是什么?

  •  6
  • FosterZ  · 技术社区  · 14 年前

    序列化到底是从哪里来的?我在网上看到了有关连载的报道,我已经知道了

    它是一个接口,如果在类中实现,则意味着它可以由不同的序列化程序自动序列化和反序列化。

    请给我一个很好的理由,为什么以及何时需要序列化类?假设一旦它被序列化,到底会发生什么?

    5 回复  |  直到 14 年前
        1
  •  25
  •   Chris Schmich    14 年前

    每当一个对象需要持久化或传输到其存在范围之外时,就需要序列化。

    持久性是将一个对象保存到某个地方并在以后以相同的状态加载它的能力。例如:

    • 您可能需要将对象实例作为文件的一部分存储在磁盘上。
    • 您可能需要将一个对象作为一个blob(二进制大对象)存储在数据库中。

    传输是将对象发送到其原始范围之外的某个接收器的能力。例如:

    • 您可能需要将对象的实例传输到远程计算机。
    • 您可能需要将实例传输到同一台计算机上的另一个AppDomain或进程。

    对于其中的每一个,都必须有一些串行位表示,可以存储、通信,然后用于重构原始对象。将一个对象转换成这一系列位的过程称为“序列化”,而将一系列位转换成原始对象的过程称为“反序列化”。

    根据目标的不同,序列化形式的对象的实际表示形式可能有所不同。例如,在C中,两个XML序列化(通过 XmlSerializer 类)和二进制序列化(通过使用 BinaryFormatter 班级)。根据您的需要,您甚至可以编写自己的自定义序列化程序来执行其他工作,如压缩或加密。如果你需要一种语言和平台无关的序列化格式,你可以试试谷歌的 Protocol Buffers 现在有 support for .NET (我没有用过这个)。

    上面提到的XML表示对于以标准格式存储对象很好,但是根据需要,它可能是冗长而缓慢的。二进制表示节省了空间,但在语言和运行时的可移植性不如XML。重要的一点是,序列化程序和反序列化程序必须相互理解。当您开始引入向后和向前的兼容性和版本控制时,这可能是一个问题。

    潜在序列化兼容性问题的示例:

    • 您发布了程序的1.0版,它可以序列化一些 Foo 对象到文件。
    • 用户执行一些操作来保存 一个文件。
    • 您使用更新的 .
    • 用户试图用版本2.0程序打开版本1.0文件。

    如果2.0版 具有版本1.0 没有。您要么显式不支持此方案,要么对序列化进行版本控制。.NET可以为您做一些这样的工作。在这种情况下,您也可能遇到相反的问题:用户可能试图打开版本2.0。 文件的版本为1.0。

    我自己没有使用这些技术,但是.NET 2.0和更高版本支持 version tolerant serialization 要支持向前和向后兼容性:

    • 对外来或意外数据的容忍。这使类型的较新版本能够将数据发送到较旧版本。
    • 缺失可选数据的公差。这使旧版本可以向新版本发送数据。
    • 序列化回调。这将在缺少数据的情况下启用智能默认值设置。
        2
  •  2
  •   MOnsDaR    14 年前

    例如,当您想通过网络发送对象或将其存储到文件中时。

    假设您正在为一个视频游戏创建一个savegame格式。然后你就可以上课了 Player 而且每一个 Enemy 可序列化的这样就可以很容易地将当前对象的状态保存到文件中。

    另一方面,当为您的游戏编写多人实现时,您可以发送 玩家 通过网络序列化到其他客户机,然后其他客户机可以处理这些数据。

        3
  •  2
  •   supercat    14 年前

    在非面向对象的语言中,通常将数据以字节模式存储在内存中,这种模式在不引用任何其他内容的情况下“有意义”。例如,图形编辑器中的一组形状可能只是将其所有点连续存储。在这样一个程序中,简单地将所有数组的内容存储到磁盘上可能会生成一个文件,当重新读取到这些数组中时,该文件将生成原始数据。

    在面向对象语言中,许多对象存储为对其他对象的引用。仅仅存储内存中数据结构的内容是没有用的,因为对对象24601的引用不会说明该对象所代表的内容。虽然一个面向对象的系统能够很好地理解内存中数据的“含义”,并尝试将其自动转换为一种合理的格式,但它无法识别指向同一对象的对象引用与指向恰好匹配的对象的对象引用之间的所有区别。因此,在将对象转换为原始比特流时,通常需要帮助系统。

        4
  •  1
  •   zerkms    14 年前

    不是类,但特定对象可能被序列化以存储在某个持久存储中,或者通过网络将对象传递给另一个应用程序。

        5
  •  1
  •   Zabba fl00r    14 年前

    例如,当您想将一个对象发送到某个URL时,您可能决定以XML格式发送它。从内存中的对象转换为(在本例中)XML的过程称为序列化。从XML转换为内存中的称为反序列化。