什么是序列化?


149

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


还要看一下这篇文章,该文章解释了为什么不使用序列化 codeproject.com/KB/dotnet/noserialise.aspx
Nipuna,2011年

4
该文章是完整的BS,因此具有其评分。
RedAces 2014年

是不是因为Google上的搜索会给出即时的答案而通常消除的过于广泛的问题?
arvymetal

2
@arvymetal你是对的。这是我在Google上搜索时的第一个结果:)正是我想要的
R_G

Answers:


143

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

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


46
同样,动词Marshaland UnmarshalSerialize和相同Deserialize
wulfgarpro 2012年

4
内存中的对象不是已经以最低级别的字节表示吗?
mahacoder '18

3
内存中的对象将由编译器,操作系统和/或硬件格式化。更改编译器,然后更改格式。序列化的对象将具有您的代码定义的格式,因此您可以保证该格式。当通过网络发送对象时,这也很有帮助-接收机器可能具有完全不同的体系结构(因此具有内存中的表示形式)。
安德鲁·巴内特

1
如此将其转换为字符串?
NoName

1
字符串可以是有效格式,但不必是字符串。字符串本身具有不同的格式(ASCII,UTF8,UTF16,EBCDIC ...),并且实际上很好地演示了该概念。字符串(内存中的对象)abc将序列化为0x61 0x62 0x63(ASCII)或0x00 0x61 0x00 0x62 0x00 0x63(UTF16)-带有或不带有NUL终止符或编码长度的东西。
安德鲁·巴内特

91

简而言之,序列化是将对象转换为字节流的过程,以便可以通过网络传输或将其存储在持久性存储中。

反序列化与之完全相反-从网络或持久性存储中获取字节流,并将其转换回状态相同的对象。

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

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

@AniketThakur一个很好的解释,您是否也可以提供一个链接让我JSON从头开始学习,因为我对此一无所知
Kasun Siyambalapitiya

每当我们谈论序列化时,为什么我们总是只引用对象。不能,我们在功能语言中使用序列化,在该语言中我们没有任何对象,而不是使用文件通过网络传输。
Pardeep Sharma

1
首先,为什么我们需要将一个对象转换为字节流并返回?对于尝试执行此操作的用户,为什么不进行隐式操作?
Aparna Chaganti

1
如果我们可以使用JSON或XML,那么为什么我们需要或说将它们转换为流的字节?然后,我们仅将它们存储到JSOn或XML中,而不是将它们转换为字节。
穆罕默德·法赞

78

通过图片的简单说明:

雷克斯,我的狗,被序列化了!

类比解释:

假设我正在和我的好友通电话,并告诉他我的新小狗。

这是我的问题:小狗是一种能呼吸的活哺乳动物。我该如何通过电话线传送一只小狗?我无法物理上将小狗放入电话听筒中。

因此,相反,我必须通过电话传达小狗的表示。换句话说,然后我将我的狗Rex序列化,然后通过电话线向他发送Rex的序列化版本:

{ "name":"Rex", "age":5, "favourite_food": pedigree_choice_cuts, "favourite_game": fetch_ball, "favourite_hobby": wagging_tail }

这是一个完美的表示-我的狗的序列化。

摘要:

序列化基本上意味着将我的狗Rex转换成其他东西-JSON对象-然后可以在电话线上以一系列1和0进行传输。然后,我在纽约市的好友可以将这些1和0转换回一个JSON对象-这样他就可以完美地代表我的狗Rex。


16

检查一下,这将给您一个很好的解释:

http://en.wikipedia.org/wiki/序列化

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

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


3
不一定只是XML,它可以是任何表示形式,甚至可以是二进制表示形式
Matthew Farwell,2009年

7

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

...

下图显示了序列化的总体过程

序列化的总体过程

...

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

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/serialization/

(强调我的)


5

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


2

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

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

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

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


1

序列化不过是将Java支持的对象转移到文件支持的形式

                         (OR)

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


1

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


不仅限于Java或C#,在大多数编程语言中,我们都使用序列化。例如在python pickle模块中也是如此。
Pardeep Sharma

0

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

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

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


0

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


0

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


0

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

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


-1

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

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

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

像这样的东西:-)


4
...除了饼干不能变成面团(反序列化)外。
戴夫·谢罗曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.