已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。
3年前关闭。
这篇文章是6个月前编辑并提交审查的,未能重新打开帖子:
原始关闭原因未解决
Improve this question
谁能告诉我Java中对象序列化的必要性是什么,并给予我一个例子来解释这个必要性?(我已经知道序列化是什么了,我只是想知道你什么时候用它,怎么用它?).
已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。
3年前关闭。
这篇文章是6个月前编辑并提交审查的,未能重新打开帖子:
原始关闭原因未解决
Improve this question
谁能告诉我Java中对象序列化的必要性是什么,并给予我一个例子来解释这个必要性?(我已经知道序列化是什么了,我只是想知道你什么时候用它,怎么用它?).
9条答案
按热度按时间pbpqsu0x1#
连载小故事
经过多年的努力,地球的科学家们开发出了一种可以帮助他们日常工作的机器人。但这个机器人的功能比火星科学家开发的机器人少。
在两个星球的科学家会面后,决定火星将把他们的机器人送到地球。但问题出现了。将100个机器人送到地球的成本是1亿美元。大约需要60天的旅行。
最后,火星科学家决定与地球科学家分享他们的秘密。这个秘密是关于类/机器人的结构。地球上的科学家在地球上开发了同样的结构。火星上的科学家们把每个机器人的数据序列化并发送到地球。地球的科学家们将数据反序列化,并将其相应地输入每个机器人。
这个过程节省了他们交流大量数据的时间。
一些机器人被用于火星上的一些防御工作。因此,他们的科学家在将数据发送到地球之前,将这些机器人的一些关键特性标记为“ transient ”。请注意,当对象被反序列化时,transient属性被设置为null(在引用的情况下)或默认值(在基元类型的情况下)。
地球科学家注意到的另一点是,火星科学家要求他们创建一些静态变量来保持环境的细节。这些细节被一些机器人使用。但火星的科学家们并没有分享这些细节。因为地球的环境和火星的环境不一样。
即使知道机器人的类结构和序列化的数据,地球的科学家也无法将可以使机器人工作的数据反序列化。
火星的科学家们正在等待完整的付款。一旦付款完成,火星的科学家与地球的科学家共享serialversionUID。地球科学家把它设置为机器人级别,一切都开始工作。
更新
虽然在串行化的帮助下,他们能够使用信号而不是实际的飞船发送数据,但他们意识到发送大量数据仍然是一个挑战。序列化使过程更便宜,更快,但它仍然很慢。因此,不同的科学家提出了不同的想法来减少数据大小。一些科学家建议压缩数据,一些建议使用不同的机制来表示它,以便它可以反序列化。一些想法是XML,JSON,msgpack,Nimn
deikduxw2#
当需要通过网络发送数据或将数据存储在文件中时,通常使用序列化。我所说的数据指的是对象而不是文本。
现在的问题是你的网络基础设施和你的硬盘是硬件组件,理解位和字节,但不是JAVA对象。
序列化是将Java对象的值/状态转换为字节,以便通过网络发送或保存。
这类似于您的语音通过PSTN电话线传输的方式。
w8rqjzmb3#
Java序列化(特别是Serializable和Exernalizable接口)允许您自动或手动地从/到磁盘或从/到网络读取/写入任意复杂的Java对象。XML和JSON是文本格式,而Java序列化是二进制格式。(序列化也是一个简单的读/写数据的一般概念,但由于问题是关于Java的,我假设你指的是内置的序列化系统,即可序列化/可执行化)
首先,你可以免费获得序列化。你不需要对你的对象做太多的修改就可以让序列化机制使用它。另一个优点是,因为它是二进制格式,所以它比文本格式更紧凑,因此可能会使用更少的空间(这有利于节省网络带宽或节省磁盘上的存储空间)。
内置Java序列化的缺点是,如果您对对象进行更改,使不同的序列化格式兼容可能真的是一场噩梦。此外,尽管您可以手动编辑XML和JSON,但不能编辑序列化的Java对象(如果不将其读入Java)。出于同样的原因,调试XML和JSON通常比调试二进制格式更容易,因为XML和JSON是人类可读的。Java内置序列化机制的另一个缺点是,您不能(轻松地)序列化/反序列化来自另一种编程语言的数据。
除了Java的内置序列化之外,还有其他的序列化技术,可以为您提供两全其美的效果:紧凑的二进制格式、语言互操作性、易于版本兼容性,通常还有调试工具,这些工具可以轻松地以可读格式转储二进制数据。例如,Google的开源protocol buffers和MessagePack是序列化库/格式的示例,它们允许您读取/写入紧凑的二进制数据并轻松维护版本兼容性。与内置Java序列化相比,这些库的最大缺点是它们涉及用于序列化的普通旧数据对象(而不是功能更全的Java对象,这些对象也具有与它们相关联的行为);然而,事实上,这个缺点是一个优点,因为将信息存储到其中/从其中存储的数据模型与 Package 它们或从它们导出的对象分离实际上是一个良好的编程实践,并且使得更容易支持多种格式。
既然你问的是需求,而不仅仅是定义,那么有很多用例:
1.只需保存您的数据以供以后使用。例如,假设您正在编写一个视频游戏。您的程序不会永远运行;即使它永远不会崩溃(希望是这种情况),您的用户可能会在某个时候退出程序,或者操作系统可能会终止程序以节省资源(例如,在Android上,用户不与之交互的后台进程经常被OS故意杀死,以回收系统资源(如RAM)。为了确保用户不会从头开始,而是可以从他们所在的位置或从最近的保存点恢复,您需要将游戏的状态写入持久存储(即硬盘驱动器、用户的Google Drive帐户等)。为此,您需要将内存中表示游戏状态的数据结构转换为可以写入磁盘(或保存数据的任何系统)的原始字节。
1.从远程服务器检索信息。让我们继续游戏的例子。。假设您正在创建在线多人游戏,或者您希望能够在用户不更新其应用程序的情况下在游戏中提供新的级别或项目。为此,您需要将有关在线玩家的信息或有关新关卡/物品的信息从服务器计算机(您将其用作安装在各种设备上的应用程序的所有副本的联系点)传送到应用程序的各个副本。服务器和应用程序都需要这些数据结构的某种内存表示(例如:其他玩家的位置、新关卡的结构、新项目的描述/图像等),但是为了将信息从服务器传送到设备上的应用程序,通信系统由原始字节组成,因此必须具有将数据转换为原始字节并从原始字节转换回有意义的存储器内数据结构的方法。
两个不同进程/应用程序之间或应用程序与某个存储系统之间的任何通信几乎都需要某种序列化机制。
2fjabf4q4#
当你想将一个对象的状态保存到一个文件中或者通过网络发送时,你需要将它转换成一系列的字节。这称为序列化。
Java有一个内置的机制,其他选项包括XML或JSON。
当你需要这个的时候:缓存对象,进行远程方法调用,将对象图保存到磁盘。
hi3rlvi25#
7uzetpgm6#
而且还可以使用序列化实现对象克隆
ego6inou7#
序列化通常指的是将对象转换为一系列位。这是java中的一个基本特性,因为java主要用于基于web的应用程序,我的意思是使数据在网络上可用
6bc51xsx8#
9vw9lbht9#
当从一个类向另一个类发送数据时出现问题时,就需要进行序列化。其他类位于不同的位置或硬盘上。例如,在分布式系统中
序列化的反向操作称为反序列化
String类和所有 Package 类默认实现可序列化接口
Serializable接口也是一个标记接口,它为类提供了序列化的能力。所以,如果我们想通过网络发送对象的状态,我们应该实现一个可序列化的接口