不是所有的对象都已经序列化了吗?

Mil*_*der 3 java serialization python-3.7

我在很多地方都读过序列化的定义。他们似乎都说这是一种将对象(在 Java 或 Python 等 OOP 语言中)转换为字节流的方法。

不是所有的对象都已经在最基本的层面上以字节流的形式存在了吗?或者当我们将任何内容保存到任何磁盘时,不是所有内容都已经只是保存的 1 和 0 并且稍后会读取吗?什么不是字节流?什么是将对象转换为相应的字节流?

k5_*_*k5_ 5

是的,您程序中的每个对象都已经由内存中某处的某种位表示。

但在一般情况下,您不能只获取这些位,将它们复制到另一个进程并期望它们工作。

这表示是高度依赖于(一)的当前状态JVM和(b)是什么版本的Java该对象是否正在运行,以及(c) 编制JIT。一些位可能在多个对象之间共享。没有必要所有位都彼此相邻。有些可能会交换到某个硬盘驱动器。出于优化原因,同一对象可能有多个副本,处于稍微不同的状态(一个在处理器缓存中,一个在二级缓存中,一个在RAM 中,一个在磁盘上)。

序列化为您提供了对象图的明确定义的位表示,因此您可以在不同的过程中实际使用它。

  • 不要忘记那些古老的好指点。如果将它们复制到其他进程,它们将指向原始进程的内存。 (2认同)

小智 5

难道所有的对象在最基本的层面上都已经以字节流的形式存在了吗?

不会。(a) 它们可能“到处都是”,并且 (b) 没有特别要求一种实现与另一种实现相同。

考虑

class MyClass {
   String s = "Hello";
 }

 MyClass thing = new MyClass();
Run Code Online (Sandbox Code Playgroud)

好的,变量“thing”指向 MyClass 的一个实例。该实例(显然)在某处占用内存。

该实例仅包含(忽略实现私有部分)对 String 对象的引用。

引用的 String 对象在其他地方。它(可能;实现对我们用户来说是不透明的)包含对某些字符的引用。

引用的字符在别处;可能在静态存储中,因为它们永远不会改变。

所以,不存在“字节流”。MyClass 的实例不是一块连续的内存。序列化是以标准化方式将所有这些单独的部分收集到字节流中。