java - java中的序列化与反序列化
问题描述
我试图了解java中序列化和反序列化之间的区别。我知道网上有很多答案和主题,但我没有找到适合理解的。
以下是我的几个疑问:
1)对象以反序列化的形式存在于内存中,但它看起来如何?它不是仅以字节形式(0 和 1)存储吗?还是其他形式?
2)一旦对象被序列化,它就是一个字节流,那么它看起来如何或与反序列化形式不同(步骤1)?
3)当我们通过网络发送对象的数据时,哪种形式转换为字节?
我知道这可能是非常愚蠢的怀疑,但请耐心等待,让我朝着正确的方向前进。!:)
解决方案
根据 Java 版本、您的 PC(如不同的字节顺序、64/32 位系统上的不同对象头大小 - 甚至 JVM 标志)以及所有内容,它可能看起来会有所不同。它还包含很多我们在序列化时不需要的数据,例如有关垃圾收集、锁、内部/系统哈希码等的信息。您可以通过查找对象头来了解更多信息:Java 对象头中是什么
但毕竟是对象只是内存中的一些字节。序列化的主要目标是创建一些标准化的形式 - 这样您就可以在不依赖于您的体系结构、系统以及不需要像 GC 那样的数据的情况下轻松地读回一些东西。
这可以是一些原始二进制格式,如默认的 java 序列化,或一些二进制 json - 或一些基于文本的格式,如 json、yaml、xml。(文本也是字节,但肯定更容易被人类显示和阅读)
另请阅读此问题以获取有关序列化本身的更多信息:什么是序列化?这是您的选择-您正在发送该对象,因此您是需要序列化它的人,在某些语言中(如果您将使用一些不安全的魔法,也可以在 java 中)可以只发送与内存中相同的数据,但是在大多数情况下,这是一个非常糟糕的主意。所以当通过网络发送数据时,你应该先序列化它。
推荐阅读
- prometheus - 计算 Prometheus 中的计数减少
- selenium - 如何将屏幕截图附加到失败的步骤?
- javascript - 我可以在 iOS 13 上以编程方式将图像从 URL 保存到图库吗?
- sqlbase - 连接在虚拟机上运行的 SQLBase Server
- r - 使用 ggplot 将 geom_abline 添加到来自 glm 的残差与拟合数据
- javascript - 从多个组件调用的多个 axios 请求中检索状态
- android - 当应用程序从另一个启动时,无法从存储中创建或读取文件
- oracle - 为什么我们需要在最后写 WHEN OTHERS THEN 异常 - Oracle PLSQL
- javascript - 类型错误:无法读取未定义 @vue/test-utils 的属性“getters”
- vue.js - 如何在 vue 测试工具中禁用“检测到全局错误处理程序”警告