为什么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,应用

  1. 保存数据以供日后使用。例如,假设您正在编写视频游戏。你的程序不会永远运行;即使它永远不会崩溃(希望是这种情况),用户可能会在某个时刻退出程序,或者操作系统可能会终止程序以节省资源(例如,在Android上,用户未与之交互的后台进程经常并故意被操作系统杀死以回收RAM等系统资源。为了确保用户从一开始就没有启动,而是可以从最近的保存点恢复,需要将游戏状态写入持久存储(即硬盘驱动器,用户的Google云端硬盘帐户等)。为此,需要将表示游戏状态的内存中的数据结构转换为可写入磁盘的原始字节(或者保存数据的任何系统)。
  2. 从远程服务器取回信息。继续游戏示例…假设正在创建一个在线多人游戏,或者能够在游戏中提供新级别或项目而无需用户更新其应用程序。为此,从服务器计算机(用作各种设备上安装的应用程序的所有副本的联系点)传达有关在线播放器的信息或有关新级别/项目的信息到应用程序的各个副本。服务器和应用程序都需要这些数据结构的某种内存表示(例如,其他玩家的位置,新级别的结构,新项目的描述/图像等),但是要传输信息从服务器到设备上的应用程序,通信系统由原始字节组成,因此有必要将数据转换为原始字节并将原始字节转换回有意义的内存数据结构。

猜你喜欢

转载自blog.csdn.net/qq_40657528/article/details/88550646