什么是序列化?
Posted
技术标签:
【中文标题】什么是序列化?【英文标题】:What is Serialization? 【发布时间】:2010-10-12 14:45:58 【问题描述】:我开始接触面向对象编程 (OOP),想知道:在 OOP 用语中,序列化是什么意思?
【问题讨论】:
还可以看看这篇文章,它解释了为什么不使用序列化codeproject.com/KB/dotnet/noserialise.aspx 那篇文章完全是 BS,因此它的评级。 【参考方案1】:什么是序列化?
图片简单说明:
总结:
序列化意味着将某些东西(例如我的狗 Rex)转换为一系列 1 和 0 - 可以通过电话线传输,存储在内存中。然后我的海外朋友可以将这些 1 和 0 翻译回小狗的完美表示(反序列化),这样他们就可以享受 Rex 的陪伴。
类比说明
朋友,这是一个比喻。我不认为你真的可以连载一只小狗LOL。您将序列化数据结构或其他一些复杂对象。 (我写了这个答案,以便您可以在不到 10 秒的时间内以一种有趣的方式理解这个概念,而不会违背技术百科全书的定义。但如果您更喜欢一个,请查看:this Wikipedia link)。
【讨论】:
这令人困惑。序列化很有用,因为您可以将对象传输到主内存或跨网络传输,然后再将它们反序列化。很难养小狗。 我认为这一点都不令人困惑!这比我读过的任何解释序列化的答案都要好。【参考方案2】:只需考虑以下想法即可理解它。
序列化:
"hello world".split() returns ['hello', 'world']
反序列化:
" ".join(['hello', 'world']) returns "hello world"
【讨论】:
【参考方案3】:序列化的名称可能来自对内存中的数据进行碎片整理。什么是内存碎片在这里描述What is memory fragmentation?
【讨论】:
【参考方案4】:简单地说序列化是一个将对象转换为字节流的过程,以便它可以通过网络传输或存储在持久存储中。
反序列化正好相反 - 从网络或持久性存储中获取字节流并将其转换回具有相同状态的对象。
要了解的是如何解释或操作这些字节流,以便我们获得完全相同的对象/相同的状态。有多种方法可以实现这一目标。其中一些是 -
-
XML:将对象转换为 XML,通过网络传输或存储在文件/数据库中。检索它并将其转换回具有相同状态的对象。在 Java 中,我们使用 JAXB(用于 XML 绑定的 Java 架构)库。(从 java 6 开始,它与 JDK 捆绑在一起)。
JSON:同样可以通过将 Object 转换为 JSON(javascript 对象表示法)来完成。同样有 GSON 库可用于此。
或者我们可以使用 OOP 语言本身提供的序列化。例如,在 Java 中,您可以序列化一个 Object,使其实现
Serializable interface
并写入 Object Stream。
【讨论】:
@AniketThakur 一个很好的解释,你能不能也提供一个链接让我从头开始了解JSON
,因为我对此一无所知
每当我们谈到序列化时,为什么我们总是只提到对象。我们不能在没有任何对象而不是使用文件通过网络传输的函数式语言中使用序列化。
首先,为什么我们需要将对象转换为字节流并返回?对于试图这样做的用户来说,为什么这不是一个隐式操作?
如果我们可以使用 JSON 或 XML 那么为什么我们需要或说将它们转换为字节流?然后我们只将它们存储到 JSOn 或 XML 中,而不是将它们转换为字节。【参考方案5】:
序列化是将对象转换为字节流以存储对象或将其传输到内存、数据库或文件的过程。它的主要目的是保存对象的状态,以便能够在需要时重新创建它。逆过程称为反序列化。
...
此图展示了序列化的整体流程
...
通过序列化,开发人员可以执行以下操作,例如通过 Web 服务将对象发送到远程应用程序、将对象从一个域传递到另一个域、将对象作为 XML 字符串通过防火墙传递,或者维护安全或跨应用程序的用户特定信息
来自https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/serialization/
(强调我的)
【讨论】:
【参考方案6】:序列化是将 Java、C# 或任何其他(OOP 语言)支持的对象转换为可传输形式的过程。通过这种方式,它可以通过网络传输或存储在磁盘上。要使一个类可序列化,它必须实现可序列化接口。
【讨论】:
不仅限于Java或C#,在大多数编程语言中我们都使用序列化。例如。在 python pickle 模块中用于相同。【参考方案7】:序列化是将对象转换为二进制数据流的过程,以便可以将其存储在文件中或通过网络发送,在该网络中可以将其复活回同一对象。
This 文档应该可以帮助您详细了解 Java 序列化。
【讨论】:
【参考方案8】:当从一个类(蓝图)实例化(构造)实际对象(事物)时,需要通过将对象(事物)序列化(将其分解为其基本原子结构)到内存中的空间来保存对象(事物) . (有点像星际迷航运输车)。您将事物分解为可以在某处传输和存储的信息流。然后,当您想要重建事物时,您只需将原子存储的实例拉回对象中即可。不同于实例化。
【讨论】:
【参考方案9】:序列化只不过是将java支持的对象转换为文件支持的形式
(OR)
将 java 支持的形式转换为网络支持的形式..序列化的主要范围不过是将数据从一层传输到另一层...只有我们可以通过网络发送的序列化对象..
【讨论】:
【参考方案10】:序列化是将无序数据(例如对象)转换为一系列标记的过程,这些标记可以在以后用于重建原始数据。序列化的形式通常是一串文本,但不一定是。
【讨论】:
【参考方案11】:序列化与将二进制对象转换为 XML(或其他字符串)表示形式有关,以便可以将其存储在数据库/文件中或在 Web 服务调用中通过网络发送。反序列化是相反的过程 - 将 XML/字符串转换回对象。
【讨论】:
【参考方案12】:序列化将数据转换为线性“字符串”字节。
其他人或多或少说了同样的话,但我强调计算机模型要求数据适合一维寻址的 RAM 或持久存储。
大多数“数据”的东西本质上都是可序列化的(即使您必须将抽象模型简化为线性模型);不可序列化例如网络连接或解析器等复杂的基于状态的机器。
【讨论】:
【参考方案13】:序列化是将对象转换为可存储的位序列。
因此您可以将此序列保存到文件、数据库或通过网络发送。
稍后您可以将其反序列化为实际对象并在需要时重复使用它。
Web Services 和 AJAX 是最常见的序列化示例。对象在向客户端发送响应之前序列化。
【讨论】:
【参考方案14】:序列化是当对象(一块内存)转换为一种形式时,对象的状态可以保存在文件中(例如)。
只要把它当作做饼干——对象是面团,饼干——是序列化的面团。
因此,通过“序列化”,您可以将 cookie 发送给您的朋友。
类似的东西:-)
【讨论】:
...除了饼干不能变回面团(反序列化)。【参考方案15】:序列化是将内存中的对象转换为字节流的过程,这样您就可以将其存储在磁盘上或通过网络发送。
反序列化是相反的过程:将字节流转换为内存中的对象。
【讨论】:
另外,动词Marshal
和Unmarshal
与Serialize
和Deserialize
同义。
内存中的对象不是已经在最低层用字节表示了吗?
内存中的对象将被编译器、操作系统和/或硬件格式化。改变你的编译器,你就改变了你的格式。序列化对象将具有由您的代码定义的格式,因此您可以保证格式。这在通过网络发送对象时也很有帮助——接收机器可能具有完全不同的架构(因此在内存中表示)。
所以它变成了一个字符串?
字符串可以是有效格式,但不一定是字符串。字符串本身有不同的格式(ASCII、UTF8、UTF16、EBCDIC...),实际上很好地展示了这个概念。字符串(内存中的对象)abc
将被序列化为 0x61 0x62 0x63
(ASCII) 或 0x00 0x61 0x00 0x62 0x00 0x63
(UTF16) -- 带有或不带有 NUL 终止符或编码长度等内容。【参考方案16】:
看看这个,这会给你一个很好的解释:
http://en.wikipedia.org/wiki/Serialization
我认为序列化一词最常见的用法是将二进制对象转换为 XML(或其他字符串)表示形式,以便可以将其存储在数据库/文件中或通过网络在 Web 服务中发送称呼。反序列化是相反的过程 - 将 XML/字符串转换回对象。
编辑: 您可能会遇到的另一个术语是编组/解组。编组与序列化的概念基本相同,解组与反序列化相同。
【讨论】:
不一定只是XML,它可以是任何表示,甚至是二进制表示以上是关于什么是序列化?的主要内容,如果未能解决你的问题,请参考以下文章