什么是序列化?

What is Serialization?

提问人: 提问时间:3/11/2009 最后编辑:Karl Knechtel 更新时间:11/8/2023 访问量:122086

问:

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

序列化 语言 - 不可知 编组 语言 - 概念

评论

0赞 Nipuna 5/12/2011
另请查看这篇文章,其中解释了为什么不使用序列化 codeproject.com/KB/dotnet/noserialise.aspx
12赞 RedAces 1/23/2014
那篇文章是完整的BS,因此它的评级。
2赞 Karl Knechtel 10/19/2022
序列化与 OOP 无关。你可以用C语言、汇编语言、Haskell语言或Lisp语言进行序列化——事实上,为了解决与OOP语言相同的问题,你必须用任何一种语言来做序列化。

答:

21赞 Andy White 3/11/2009 #1

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

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

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

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

评论

3赞 Matthew Farwell 3/11/2009
不一定只是 XML,它可以是任何表示形式,甚至是二进制表示形式
223赞 Andrew Barnett 3/11/2009 #2

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

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

评论

69赞 wulfgarpro 12/27/2012
此外,动词 and 是 和 的同义词。MarshalUnmarshalSerializeDeserialize
15赞 mahacoder 10/13/2018
内存中的对象不是已经表示为最低级别的字节吗?
21赞 Andrew Barnett 6/18/2019
内存中的对象将由编译器、操作系统和/或硬件格式化。更改编译器,即可更改格式。序列化对象将具有由代码定义的格式,因此可以保证格式。这在通过网络发送对象时也很有用 - 接收计算机可能具有完全不同的体系结构(因此具有内存中的表示形式)。
4赞 NoName 10/8/2019
所以它把它变成了一根绳子?
7赞 Andrew Barnett 10/11/2019
字符串可以是有效的格式,但不一定是字符串。字符串本身有不同的格式(ASCII、UTF8、UTF16、EBCDIC等),实际上很好地展示了这个概念。字符串(内存中的对象)将被序列化为 (ASCII) 或 (UTF16) -- 有或没有 NUL 终止符或编码长度之类的东西。abc0x61 0x62 0x630x00 0x61 0x00 0x62 0x00 0x63
-1赞 Mr.ElectroNick 3/11/2009 #3

序列化是指对象(内存块)以表单形式转换,而对象的状态可以保存在文件中(例如)。

把它看作是制作饼干 - 对象是一个面团,饼干 - 是一个序列化的面团。

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

类似的东西:-)

评论

5赞 Dave Sherohman 2/26/2010
...除了饼干不能变回面团(反序列化)。
2赞 Canavar 3/11/2009 #4

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

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

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

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

0赞 Overflown 3/11/2009 #5

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

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

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

0赞 viswanathan 2/26/2010 #6

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

8赞 Dave Sherohman 2/26/2010 #7

序列化是将无序数据(例如对象)转换为一系列标记的过程,这些标记稍后可用于重建原始数据。序列化形式通常是文本字符串,但不一定是。

1赞 sriiii 11/8/2012 #8

序列化只不过是将 Java 支持的对象传输到文件支持的形式

(或)

将 Java 支持的表单转换为网络支持的表单。.序列化的主要范围无非是将数据从一层传输到另一层......只有序列化对象我们才能通过网络发送。.

1赞 David K Hill 12/24/2013 #9

当从类(蓝图)实例化(构造)实际对象(事物)时,需要通过将对象(事物)序列化(将其分解为其基本原子结构)来保存到内存中的空间。(有点像《星际迷航》运输车)。你把这个东西分解成它可以被传送到某个地方并存储的信息流。然后,当你想要重建这个东西时,你只需将原子存储的实例拉回对象中。与实例化不同。

128赞 Aniket Thakur 8/31/2014 #10

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

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

需要理解的是,这些字节流是如何被解释或操作的,以便我们得到完全相同的对象/相同的状态。有多种方法可以实现这一目标。其中一些是——

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

评论

1赞 Kasun Siyambalapitiya 7/22/2016
@AniketThakur 一个很好的解释,您能否提供一个链接让我从头开始学习,因为我对此一无所知JSON
0赞 Pardeep Sharma 4/5/2018
每当我们谈论序列化时,为什么我们总是只引用对象。我们不能在函数式语言中使用序列化,因为我们没有任何对象,而不是使用文件通过网络传输。
2赞 Aparna Chaganti 4/23/2018
首先,为什么我们需要将对象转换为字节流并返回?对于尝试这样做的用户来说,为什么不是隐式操作?
1赞 Muhammad Faizan Fareed 2/23/2020
如果我们可以使用 JSON 或 XML,那么为什么我们需要或说将它们转换为流的字节?然后我们只将它们存储到 JSOn 或 XML 中,而不是将它们转换为字节。
-1赞 Nikhil Katre 7/29/2016 #11

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

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

2赞 Nesan Mano 9/23/2017 #12

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

评论

1赞 Pardeep Sharma 4/5/2018
不仅限于 Java 或 C#,在大多数编程语言中我们都使用序列化。例如,在 python 中,pickle 模块也用于相同的目的。
0赞 user207421 11/5/2023
也不仅限于 OOP。
138赞 BenKoshy 2/1/2018 #13

什么是序列化?

通过图片类比解释:

Rex, my dog, is serialised!

总结:

序列化意味着将某些东西(例如我的狗 Rex)转换为一系列 1 和 0 - 可以传输/存储等。然后,我在海外的朋友可以将这些 1 和 0 转换回小狗的完美表现(反序列化)。

类比的澄清

朋友们,这是一个类比。我不认为你真的可以序列化一只小狗(还)。您将序列化数据结构或其他一些复杂对象。

(我写了这个答案,这样你就可以在 5 秒内以一种有趣的方式理解基本概念,然后继续前进——它从来都不是学术解释,也不是 100% 完美的。考虑维基百科关于序列化的条目或其他答案,或者随意编写自己的答案 - 你会很快意识到,完美地解释某些东西是不可能的,但 caviling 是超级容易的!

评论

7赞 anon01 9/5/2020
这令人困惑。序列化非常有用,因为您可以将对象传输到主内存或跨网络,并在以后再次反序列化它们。小狗很难。
8赞 Siddharth Choudhary 1/27/2021
我认为这一点也不令人困惑!这比我读过的任何解释序列化的答案都要好得多。
1赞 user207421 4/29/2022
通过真正的序列化,你会得到一个小狗的副本。拙劣的类比。
1赞 Jeb50 9/27/2022
很好的类比,简单的英语很容易理解。继续!:)
17赞 Chamin Wickramarathna 2/1/2018 #14

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

...

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

Overall process of serialization

...

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

从 https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/serialization/

(强调我的)

-3赞 Muhammad Akram 3/17/2021 #15

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

序列化:

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

反序列化:

" ".join(['hello', 'world']) returns "hello world"
0赞 Enough Technology 7/9/2022 #16

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

enter image description here