Java中的序列化与反序列化

时间:2018-07-13 13:39:04

标签: java serialization deserialization

我试图了解Java中序列化和反序列化之间的区别。我知道在线上有很多答案和主题,但是我没有找到适合的答案。

以下是我的一些疑问:

1)对象以反序列化的形式位于内存中,但是看起来如何?它是否仅以字节形式(0和1)存储?还是其他任何形式?

2)一旦对象被序列化,它就是一个字节流,那么它的外观或与反序列化形式的不同(步骤1)?

3)当我们通过网络发送对象的数据时,该格式将转换为字节吗?

我知道这可能是非常愚蠢的疑问,但是请忍受我并朝正确的方向前进。 :)

1 个答案:

答案 0 :(得分:1)

  1. 它的外观可能会有所不同,具体取决于Java版本,您的PC(例如不同的字节顺序,64/32位系统上不同的对象标头大小-甚至是JVM标志),以及所有内容。它还包含许多在序列化时不需要的数据,例如有关垃圾回收,锁,内部/系统哈希码等的信息。您可以通过查找对象标头来了解更多信息:What is in java object header
    但是毕竟对象只是内存中的一些字节。

  2. 序列化的主要目标是创建某种标准化的格式-这样一来,您以后就可以轻松读取这些内容,而无需依赖于体系结构,系统,也不需要像GC one这样的数据。
    这可以是某种原始二进制格式,例如默认的Java序列化,也可以是二进制json-或某些基于文本的格式,例如json,yaml,xml。 (文本也是字节,但是可以肯定地更容易显示和阅读)
    另请阅读此问题以获取有关序列化本身的更多信息:What is serialization?

  3. 这是您的选择-您正在发送该对象,因此您是需要对其进行序列化的对象,在某些语言中(如果您将使用一些不安全的魔术,在Java中也可以)发送该对象数据存储在内存中,但是在大多数情况下,这是一个非常糟糕的主意。因此,在通过网络发送数据时,您应该先对其进行序列化。