在编程中,“serialized”对象是什么?

46

我经常见到“serialized”这个词,但从未解释过。请解释一下它的含义。


1
如果有人能提供详细的例子,那就太好了。当我查阅这个主题时,我也感到困惑。例如使用Python的pickle.dump(object, file)pickle.load(file)等示例,实际上对于理解毫无帮助。 - Mike Williamson
6个回答

63

序列化通常是指将一个抽象数据类型转换为一串字节的过程(有时候也可以序列化为文本、XML、CSV或其他格式。重要的是它是一种简单的格式,可以在不理解数据所代表的抽象对象的情况下进行读取/写入)。当保存数据到文件或通过网络传输时,你不能只存储一个MyClass对象,你只能存储字节。因此,你需要获取重构对象所需的所有数据,并将其转换为一个可写入目标设备的字节序列,并在稍后的某个时间点读回并反序列化以重构你的对象。


16
类对象是抽象数据类型,抽象意味着“不是原始数据类型,而是代表抽象概念的东西”。Car类是一个抽象数据类型,它在程序中代表某个抽象的概念。它里面没有汽车,只有提供了抽象一个汽车所需的数据。为了序列化它,这种抽象必须被拆除。你不能将一辆汽车存储到文件中,但可以存储重建Car类实例所需的数据。 - jalf
7
不,我不是在谈论抽象类,我同意这是完全不同的东西。抽象数据类型基本上是类的更一般术语(除此之外还很好地涵盖了无类语言中的等效项)。类是一种抽象,也是一种数据类型。称其为抽象数据类型并不是我刚想出来的主意。 :) - jalf

15

序列化是指将一个对象实例转换成可在网络传输或持久化到存储设备(如文件或数据库)中的格式。序列化格式包含对象的状态信息。

反序列化是指使用序列化状态来重建对象,使其恢复到原始状态的过程。


6
真正简单的解释是,序列化是将存储在内存中的类实例(对象)转换为适合传输或存储的结构的行为。
常见的例子是用于Web服务的XML序列化 - 我在服务器上有一个类实例,并且需要将其发送到您那里,我首先将其序列化为XML,这意味着创建该类中数据的XML版本,一旦在XML中,我可以使用像HTTP这样的传输轻松地发送它。
有几种形式的序列化,如XML或JSON。

6

序列化有至少两个完全不同的含义。一个是将内存中的数据结构转换为一串位,以便可以将其写入磁盘并在以后重新构建,或在网络连接上传输并在另一台机器上使用等。

另一个含义与串行与并行执行相关--即确保只有一个执行线程在执行某些操作。例如,如果您要读取、修改和写入一个变量,则需要确保一个线程完成读取、修改、写入序列后才能启动另一个线程。


我很高兴有人提到了“序列化”的另一种含义——我记得第一次遇到“将对象输出到文件”这个意思时感到困惑,因为在那之前我已经使用它来表示“临界区”了很长一段时间。 - Michael Burr
1
不可以 - “serialized”也可以用来表示“序列化访问数据或代码”。在Java/.NET的上下文中,“marshalling”是我用来表示将对象的数据从文件(或其他流)读取/写入的术语,直到“serialization”这个术语被使用。 - Michael Burr

3

他们说的是,“串行”一词指的是数据字节必须按照某种标准顺序放置才能写入串行存储设备,例如文件输出流或串行总线。实际上,原始字节很少足够。例如,序列化数据结构的程序中的内存地址可能在从存储的数据重构对象的程序中无效。因此需要一种协议。多年来,已经有许多标准和实现。我记得80年代中期有一个叫做XDR的协议,但它不是第一个。


1
  • 您有特定格式的数据(例如列表、映射、对象等)
  • 您想要传输这些数据(例如通过API或函数调用)
  • 传输方式仅支持某些数据类型(例如JSON、XML等)
  • 序列化:您将现有数据转换为支持的数据类型,以便可以进行传输。

关键在于您需要传输数据,而传输方式只允许某些格式。您当前的数据格式不被允许,因此必须“序列化”它。正如Mitch所回答的那样:

序列化是将对象实例转换为可传输格式的过程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接