如果所有内容都已存储为位,为什么我们需要序列化?
Why do we need serialization if everything is already stored as bits?
来自https://docs.oracle.com/javase/tutorial/jndi/objects/serial.html
To serialize an object means to convert its state to a byte stream so
that the byte stream can be reverted back into a copy of the object.
既然所有内容都以 0 和 1 的形式存储在内存中,为什么还需要将对象解构为可以通过流传输的形式?为什么现有的状态还不够好传输?
如果你找到 01000001,你怎么知道它是数字 65 还是 A 的 ASCII?或者也许是 wav 文件中的频率?它可能是位图中的颜色信息。
信息的解读方式有很多种。您必须为接收者提供一种解释信息的方式。我的第一个例子可能有点傻。相反,将 CSV 文件与 JSON 文件进行比较。尝试在 CSV 中重新创建 JSON 结构。不会好看的
Java 的序列化背后也存在相同的逻辑。你怎么知道 class 定义是什么样子的?
主要原因:表示一个实例的数据不连续。
在
To serialize an object means to convert its state to a byte stream so
that the byte stream can be reverted back into a copy of the object.
主要关键词是“字节流”,意思是字节序列。
您的方法符合 Pascal 和 C 等语言的概念,其中大多数数据结构最终都表示为 连续 字节块。
使用像 Java 这样的语言,实例字段通常不包含字段值,而是引用包含值的其他实例或引用更多实例,等等。即使是只有一个 String
字段的简单 class 也会(至少)出现三个不同的实例:
- 主实例,包含对字符串的引用。
- 一个
String
实例,引用了字符数组,
- 一个
char[]
数组保存字符串的内容。
并且无法保证这些实例位于内存中的任何位置,很可能不在连续的位置。因此,内存中表示确实由字节组成,但不是按顺序排列。
这就是我们谈论“序列化”的原因,这个过程从更类似于相互关联的元素网络的东西中创建串行字节流。
来自https://docs.oracle.com/javase/tutorial/jndi/objects/serial.html
To serialize an object means to convert its state to a byte stream so that the byte stream can be reverted back into a copy of the object.
既然所有内容都以 0 和 1 的形式存储在内存中,为什么还需要将对象解构为可以通过流传输的形式?为什么现有的状态还不够好传输?
如果你找到 01000001,你怎么知道它是数字 65 还是 A 的 ASCII?或者也许是 wav 文件中的频率?它可能是位图中的颜色信息。
信息的解读方式有很多种。您必须为接收者提供一种解释信息的方式。我的第一个例子可能有点傻。相反,将 CSV 文件与 JSON 文件进行比较。尝试在 CSV 中重新创建 JSON 结构。不会好看的
Java 的序列化背后也存在相同的逻辑。你怎么知道 class 定义是什么样子的?
主要原因:表示一个实例的数据不连续。
在
To serialize an object means to convert its state to a byte stream so that the byte stream can be reverted back into a copy of the object.
主要关键词是“字节流”,意思是字节序列。
您的方法符合 Pascal 和 C 等语言的概念,其中大多数数据结构最终都表示为 连续 字节块。
使用像 Java 这样的语言,实例字段通常不包含字段值,而是引用包含值的其他实例或引用更多实例,等等。即使是只有一个 String
字段的简单 class 也会(至少)出现三个不同的实例:
- 主实例,包含对字符串的引用。
- 一个
String
实例,引用了字符数组, - 一个
char[]
数组保存字符串的内容。
并且无法保证这些实例位于内存中的任何位置,很可能不在连续的位置。因此,内存中表示确实由字节组成,但不是按顺序排列。
这就是我们谈论“序列化”的原因,这个过程从更类似于相互关联的元素网络的东西中创建串行字节流。