首页 > 解决方案 > java中的序列化与反序列化

问题描述

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

以下是我的几个疑问:

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

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

3)当我们通过网络发送对象的数据时,哪种形式转换为字节?

我知道这可能是非常愚蠢的怀疑,但请耐心等待,让我朝着正确的方向前进。!:)

标签: javaserializationdeserialization

解决方案


  1. 根据 Java 版本、您的 PC(如不同的字节顺序、64/32 位系统上的不同对象头大小 - 甚至 JVM 标志)以及所有内容,它可能看起来会有所不同。它还包含很多我们在序列化时不需要的数据,例如有关垃圾收集、锁、内部/系统哈希码等的信息。您可以通过查找对象头来了解更多信息:Java 对象头中是什么
    但毕竟是对象只是内存中的一些字节。

  2. 序列化的主要目标是创建一些标准化的形式 - 这样您就可以在不依赖于您的体系结构、系统以及不需要像 GC 那样的数据的情况下轻松地读回一些东西。
    这可以是一些原始二进制格式,如默认的 java 序列化,或一些二进制 json - 或一些基于文本的格式,如 json、yaml、xml。(文本也是字节,但肯定更容易被人类显示和阅读)
    另请阅读此问题以获取有关序列化本身的更多信息:什么是序列化?

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


推荐阅读