206

我开始使用面向对象编程 (OOP),想知道:在 OOP 用语中,序列化的含义是什么?

4

16 回答 16

199

序列化是将内存中的对象转换为字节流的过程,因此您可以执行诸如将其存储在磁盘上或通过网络发送之类的操作。

反序列化是相反的过程:将字节流转换为内存中的对象。

于 2009-03-11T05:06:59.333 回答
123

简单地说,序列化是将对象转换为字节流的过程,以便它可以通过网络传输或存储在持久存储中。

反序列化正好相反——从网络或持久存储中获取字节流并将其转换回具有相同状态的对象。

要了解的是如何解释或操作这些字节流,以便我们获得完全相同的对象/相同的状态。有多种方法可以实现这一目标。他们之中有一些是 -

  1. XML:将对象转换为 XML,通过网络传输或存储在文件/数据库中。检索它并将其转换回具有相同状态的对象。在 Java 中,我们使用JAXB(用于 XML 绑定的 Java 架构)库。(从 java 6 开始,它与 JDK 捆绑在一起)。
  2. JSON:同样可以通过将对象转换为JSON(JavaScript 对象表示法)来完成。同样有可以用于此的 GSON 库。
  3. 或者我们可以使用 OOP 语言本身提供的序列化。例如,在 Java 中,您可以序列化一个对象,使其实现Serializable interface并写入对象流。
于 2014-08-30T18:36:19.680 回答
119

什么是序列化?

通过图片简单解释:

雷克斯,我的狗,被连载了!

概括:

序列化意味着将某些东西(例如我的狗 Rex)转换为一系列 1 和 0 - 可以通过电话线传输,存储在内存中。然后,我在海外的朋友可以将这些 1 和 0 翻译回小狗的完美表示(反序列化),这样他们就可以享受 Rex 的陪伴。

类比的澄清

朋友,这是一个比喻。我认为您实际上无法连载小狗LOL。您将序列化数据结构或其他一些复杂对象。(我写了这个答案,这样你就可以在不到 10 秒的时间内以一种有趣的方式理解这个概念,而不会打破你的技术百科定义。但如果你更喜欢一个,请查看:这个 Wikipedia 链接)。

于 2018-02-01T01:25:40.023 回答
21

看看这个,这会给你一个很好的解释:

http://en.wikipedia.org/wiki/Serialization

我认为序列化一词最常见的用法是将二进制对象转换为 XML(或其他字符串)表示形式,以便可以将其存储在数据库/文件中或在 Web 服务调用中通过网络发送。反序列化是相反的过程 - 将 XML/字符串转换回对象。

编辑:您可能会遇到的另一个术语是编组/解组。编组与序列化的概念基本相同,解组与反序列化相同。

于 2009-03-11T05:06:01.003 回答
16

序列化是将对象转换为字节流以存储对象或将其传输到内存、数据库或文件的过程。它的主要目的是保存对象的状态,以便能够在需要时重新创建它。反向过程称为反序列化。

...

这张图展示了序列化的整体流程

序列化的总体流程

...

通过序列化,开发人员可以执行以下操作,例如通过 Web 服务将对象发送到远程应用程序、将对象从一个域传递到另一个域、将对象作为 XML 字符串通过防火墙传递,或者维护安全性或用户特定跨应用程序的信息

来自https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/serialization/

(强调我的)

于 2018-02-01T05:47:25.423 回答
8

序列化是将无序数据(例如对象)转换为一系列标记的过程,这些标记可以在以后用于重建原始数据。序列化形式通常是一串文本,但并非必须如此。

于 2010-02-26T11:12:52.697 回答
3

序列化是将 Java、C# 或任何其他(OOP 语言)支持的对象转换为可传输形式的过程。通过这种方式,它可以通过网络传输或存储在磁盘上。要使一个类可序列化,它必须实现可序列化接口。

于 2017-09-23T01:48:02.073 回答
2

序列化是将对象转换为可存储的位序列。

因此您可以将此序列保存到文件、数据库或通过网络发送。

稍后您可以将其反序列化为实际对象并在需要时重用它。

Web 服务AJAX是最常见的序列化示例。在向客户端发送响应之前序列化的对象。

于 2009-03-11T05:10:50.557 回答
1

从类(蓝图)实例化(构造)实际对象(事物)时,需要通过将对象(事物)序列化(将其分解为其基本原子结构)到内存空间中来保存对象(事物)。(有点像星际迷航运输车)。您将事物分解为可以在某处传输和存储的信息流。然后,当您想要重建事物时,您只需将原子存储的实例拉回对象中。不同于实例化。

于 2013-12-24T10:35:06.993 回答
1

序列化只不过是将 java 支持的对象转换为文件支持的形式

                         (OR)

将 java 支持的形式转换为网络支持的形式..序列化的主要范围不过是将数据从一层传输到另一层...只有我们可以通过网络发送的序列化对象..

于 2012-11-08T10:12:15.860 回答
0

序列化将数据转换为线性的字节“字符串”。

其他人或多或少说了同样的话,但我强调计算机模型要求数据适合一维寻址的 RAM 或持久存储。

大多数“数据”的东西本质上都是可序列化的(即使您必须将抽象模型简化为线性模型);不可序列化的网络连接或复杂的基于状态的机器(如解析器)。

于 2009-03-11T06:55:44.097 回答
0

序列化与将二进制对象转换为 XML(或其他字符串)表示形式有关,以便可以将其存储在数据库/文件中或在 Web 服务调用中通过网络发送。反序列化是相反的过程 - 将 XML/字符串转换回对象。

于 2010-02-26T10:32:22.990 回答
0

序列化是将对象转换为二进制数据流的过程,以便可以将其存储在文件中或通过网络发送,在该网络中可以将其复活回同一对象。

文档应该可以帮助您详细了解 Java 序列化。

于 2016-07-29T02:26:44.713 回答
-1

序列化是当对象的状态可以保存在文件中时(例如)将对象(一块内存)转换为一种形式。

只需将其视为制作饼干 - 对象是面团,饼干 - 是序列化的面团。

因此,通过“序列化”,您可以将 cookie 发送给您的朋友。

类似的东西:-)

于 2009-03-11T05:07:59.767 回答
-2

序列化的名称可能来自对内存中的数据进行碎片整理。这里描述什么是内存碎片 什么是内存碎片?

于 2020-09-22T17:01:09.497 回答
-2

只需考虑以下想法即可理解它。

序列化:

"hello world".split() returns ['hello', 'world']

反序列化:

" ".join(['hello', 'world']) returns "hello world"
于 2021-03-17T11:08:02.083 回答