什么是序列化?

时间:2009-03-11 05:03:18

标签: java oop serialization marshalling

我开始使用OOP编程,想知道OOP用语中序列化的含义是什么?

16 个答案:

答案 0 :(得分:115)

序列化是将内存中的对象转换为字节流的过程,这样您就可以将其存储在磁盘上或通过网络发送。

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

答案 1 :(得分:69)

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

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

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

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

答案 2 :(得分:42)

图片说明:

Rex, my dog, is serialised!

类比解释:

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

这是我的问题:小狗是一种活的,呼吸的哺乳动物。我是怎么想通过电话线传送一只小狗的?我无法将我的小狗放入我的手机接收器中。

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

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

它是一个完美的代表 - 我的狗的序列化。

要点:

序列化基本上意味着将我的狗Rex转换成其他东西 - 一个JSON对象 - 然后可以通过电话线传输为一系列的1和0。我在NYC的伙伴然后可以将那些1和0转换回JSON对象 - 这样他就可以完美地代表我的狗Rex。简单!

有任何问题吗?只需发表评论。

答案 3 :(得分:14)

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

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

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

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

答案 4 :(得分:5)

序列化是将无序数据(例如对象)转换为令牌的系列的过程,稍后可以使用它来重建原始数据。序列化表单通常是一串文本,但不一定是。

答案 5 :(得分:5)

  

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

     

...

     

此图显示了序列化的整个过程

     

Overall process of serialization

     

...

     

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

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

(强调我的)

答案 6 :(得分:2)

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

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

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

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

答案 7 :(得分:1)

序列化是指当对象的状态可以保存在文件中时,对象(一块内存)以表格形式翻译(作为示例)。

将它视为制作饼干 - 对象是面团,饼干 - 是一个连续的面团。

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

类似的东西: - )

答案 8 :(得分:1)

序列化只不过是将java支持的对象转移到文件支持的表单

                         (OR)

将java支持的表单转换为网络支持的表单..序列化的主要范围只是将数据从一个层传输到另一个层...只能通过网络发送的序列化对象..

答案 9 :(得分:1)

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

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

序列化的名称可能来自对内存中的数据进行碎片整理。 What is memory fragmentation?

中描述了什么是内存碎片

答案 15 :(得分:0)

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

序列化:

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

反序列化:

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