为什么Java需要对象的序列化

简介: 为什么Java需要对象的序列化

1,什么是序列化


序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。


2,Java的序列化


将JOPO转换成字节流


3,Java序列化的意义(为什么需要序列化)


将对象流化,更易在信道上传输或者保存在文件中

网络基础结构和硬盘这些硬件组件能够理解bits和bytes,但不了解Java对象

这类似于语音通过PSTN电话线传输的原理


4,形象例子


经过多年的努力,地球科学家开发出一种可以帮助他们日常工作的机器人。但是这个机器人的功能比火星行星科学家开发的机器人要少。

在两个行星的科学家会面后,火星将用飞船他们的机器人送到地球。但是问题来了。向地球发送100台机器人的费用为1亿美元。旅行大约需要60天。

最后,火星的科学家决定与地球科学家分享他们的秘密。这个秘密是关于机器人(类比Java中的class)的结构。地球科学家在地球上开发了相同的结构。 火星的科学家将每个机器人的数据序列化并将其发送到地球。地球科学家对数据进行反序列化并相应地将其输入给每个机器人。这个过程节省了他们传递大量数据的时间。

一些机器人被用于火星上的一些防御工作。因此,在将数据发送到地球之前,将这些机器人的一些重要特性标记为瞬态。请注意,在对象进行反序列化时,瞬态属性设置为null(在引用的情况下)或默认值(在基本类型的情况下)。

地球科学家注意到的另一点是,火星的科学家要求他们创建一些静态变量来保存环境细节。一些机器人使用这些细节。但是火星的科学家并没有分享这些细节。因为地球的环境与火星的环境不同。即使了解机器人类结构并具有序列化数据,地球科学家也无法对可以使机器人工作的数据进行反序列化。


Exception in thread "main" java.io.InvalidClassException:
SerializeMe; local class incompatible: stream classdesc
:

火星的科学家们正在等待全部付款。 付款完成后,再与地球科学家分享了serialversionUID。 地球科学家把它设置为机器人类,一切都开始工作了。


PS:

虽然在序列化的帮助下,他们能够使用信号而不是实际的太空船发送数据,他们意识到发送大量数据仍然是一个挑战。 序列化使流程更便宜,更快,但仍然很慢。 因此,不同的科学家提出了不同的想法来减少数据量。 一些科学家建议压缩数据,有些建议使用不同的机制来表示它,以便可以反序列化。比如XMLJSONmsgpack等。


5,应用


保存数据以供日后使用。例如,假设您正在编写视频游戏。你的程序不会永远运行;即使它永远不会崩溃(希望是这种情况),用户可能会在某个时刻退出程序,或者操作系统可能会终止程序以节省资源(例如,在Android上,用户未与之交互的后台进程经常并故意被操作系统杀死以回收RAM等系统资源。为了确保用户从一开始就没有启动,而是可以从最近的保存点恢复,需要将游戏状态写入持久存储(即硬盘驱动器,用户的Google云端硬盘帐户等)。为此,需要将表示游戏状态的内存中的数据结构转换为可写入磁盘的原始字节(或者保存数据的任何系统)。

从远程服务器取回信息。继续游戏示例…假设正在创建一个在线多人游戏,或者能够在游戏中提供新级别或项目而无需用户更新其应用程序。为此,从服务器计算机(用作各种设备上安装的应用程序的所有副本的联系点)传达有关在线播放器的信息或有关新级别/项目的信息到应用程序的各个副本。服务器和应用程序都需要这些数据结构的某种内存表示(例如,其他玩家的位置,新级别的结构,新项目的描述/图像等),但是要传输信息从服务器到设备上的应用程序,通信系统由原始字节组成,因此有必要将数据转换为原始字节并将原始字节转换回有意义的内存数据结构。


相关文章
|
2月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
3月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
62 17
|
2月前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
86 5
|
2月前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
33 3
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
3月前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
3月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
38 6
|
3月前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
35 3
|
3月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
2月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
55 0