序列化和普通对象存储之间的区别
本文关键字:之间 区别 存储 对象 序列化 | 更新日期: 2023-09-27 18:32:47
>序列化是将存储在内存中的对象转换为字节流的过程,这些字节流要通过网络传输,存储在数据库中等。
但是对象不是已经作为位和字节存储在内存中了吗?为什么我们需要另一个进程将存储为字节的对象转换为另一个字节表示形式?我们不能直接通过网络传输对象吗?
我想我可能缺少对象在内存中的存储方式或访问对象字段的方式。
有人可以帮助我澄清这种困惑吗?
不同的系统不会以相同的方式将内容存储在内存中。一个明显的例子是字节序。
序列化定义了使用不同内存中表示形式的系统可以通信的方式。
另一个重要的事实是,对内存中数据和序列化数据的要求可能不同:当内存中时,需要快速读取(可能还有写入(访问;当序列化时,需要小尺寸。创建两种不同的格式以适应这两种用例比创建一种对两者都有好处的格式更容易。
我想到的一个例子是LinkedHashMap
:这基本上在内存中存储两个版本的映射(一个用于捕获插入顺序;一个作为传统的哈希映射(。但是,您不需要这两种表示形式来从序列化表单重建相同的映射:您只需要键/值对的插入顺序。因此,序列化窗体不存储与内存中窗体相同的数据。
内存中预先存在的字节转换为通用形式。
这样做是因为不同的系统以不同的方式分配内存。因此,我们无法确保对象可以直接从一台机器上的内存中保存,然后正确地加载回另一台不同的机器中。
Mabe您可以在Oracle文档的此页面上找到更多信息。
对象序列化的解释,摘自《在 Java 中思考》一书。
创建对象时,只要您需要它,它就会存在,但在任何情况下,当程序终止时,它都不存在。虽然这在一开始是有道理的,但在某些情况下,如果一个对象可以存在并保存其信息,即使程序没有运行,那将非常有用。然后,下次启动程序时,对象将在那里,并且它将具有与上次程序运行时相同的信息。当然,您可以通过将信息写入文件或数据库来获得类似的效果,但是本着使所有内容都成为对象的精神,将对象声明为"持久"并为您处理所有细节会非常方便。
Java 的对象序列化允许您获取实现 Serializable 接口的任何对象,并将其转换为字节序列,稍后可以完全恢复以重新生成原始对象。这在整个网络中也是如此,这意味着序列化机制会自动补偿操作系统的差异。也就是说,您可以在Windows计算机上创建一个对象,对其进行序列化,然后将其通过网络发送到Unix计算机,在那里将正确重建该对象。您不必担心不同计算机上的数据表示形式、字节排序或任何其他详细信息。
希望这对你有帮助。
让我们按照这套思路:我们按原样获取对象,并通过网络将其作为字节数组发送。 另一个套接字/httphandler接收该字节数组。
现在,我想到了两件事:
- 要发送多少字节? 这些
- 字节是什么?这些 BTYE 代表什么类?
您还必须提供此数据。 因此,仅对于此操作,我们就需要额外的 2 个步骤。
现在,在 C# 和 Java 中,与 C++ 相反,对象分散在堆中,每个对象都包含对其包含的对象的引用,所以现在我们有另一个要求
- 递归地"捕获"所有内部对象并将它们打包到字节数组中
现在我们得到了表示一些对象 hirarchy 的打包字节数组,我们需要告诉另一方如何将这个字节数组解压缩回 object+它所持有的对象
- 发送有关如何解压缩该字节数组到对象层次结构的信息
obejct 具有的某些实体无法通过网络发送,例如函数。 所以现在我们又迈出了一步
- 剥离无法序列化的内容,例如函数
这个过程还在继续,对于每一个新的解决方案,你都会发现很多问题。序列化是获取您正在谈论的字节数组并使其成为可以在其他环境中处理(如网络/文件(的过程。