Java中序列化的目的是什么?

m_a*_*han 101 java oop serialization object stream

我已经阅读了很多关于序列化的文章以及它如何如此美妙和精彩,但没有一个论点足够令人信服.我想知道是否有人能真正告诉我通过序列化一个类我们能真正实现的目标是什么?

小智 177

让我们首先定义序列化,然后我们可以讨论为什么它如此有用.

序列化只是将现有对象转换为字节数组.此字节数组表示对象的类,对象的版本以及对象的内部状态.然后可以在运行相同代码的JVM之间使用此字节数组来传输/读取对象.

我们为什么要这样做?

有几个原因:

  • 通信:如果您有两台运行相同代码的计算机,并且需要进行通信,则一台计算机可以轻松地构建一个包含其要传输的信息的对象,然后将该对象序列化到另一台计算机.这不是最好的沟通方式,但它完成了工作.

  • 持久性:如果要将特定操作的状态存储在数据库中,可以将其轻松序列化为字节数组,并存储在数据库中以供以后检索.

  • 深层复制:如果您需要Object 的精确副本,并且不想编写自己的专用clone()类,只需将对象序列化为字节数组,然后将其反序列化为另一个对象实现了这个目标.

  • 缓存:真的只是上面的一个应用程序,但有时一个对象需要10分钟来构建,但只需要10秒钟来反序列化.因此,不要抓住内存中的巨大对象,而是通过序列化将其缓存到文件中,并在以后需要时将其读取.

  • 交叉JVM同步:序列化适用于可能在不同体系结构上运行的不同JVM.

  • 究竟需要10分钟才能建成? (60认同)
  • @oxbow_lakes例如,如果您维护一组特定数据的索引以进行快速搜索,则可能是一个例子.像这样的索引可能需要很长时间才能构建,但是一旦你构建它就可以相对快速地序列化/反序列化. (11认同)
  • @ Schmelter最好的沟通方式是什么? (3认同)
  • 我的观点(当然)是序列化中涉及的文件I/O可能会使任何纯对象创建开销相形见绌.我想你可能在谈论计算上非常昂贵的东西,比如科学建模,但序列化是一种非常糟糕的持久性机制,因为它很难处理架构变化 (2认同)

Gor*_*son 55

在运行应用程序时,它的所有对象都存储在内存(RAM)中.当您退出时,操作系统将回收该内存,并且您的程序基本上"忘记"运行时发生的所有事情.序列化可以通过让您的应用程序将对象保存到磁盘来解决这个问题,以便它可以在下次启动时将其读回.如果您的应用程序将提供保存/共享以前状态的任何方式,您将需要某种形式的序列化.

  • 因此,这似乎是将数据写入文件并在需要时回读的一种更好,更有效的方法? (2认同)

Rus*_*ams 20

我可以分享我的故事,我希望它会提供一些想法,为什么序列化是必要的.但是,您的问题的答案已经非常详细.

我有几个项目需要加载和读取一堆文本文件.这些文件包含停用词,生物医学动词,生物医学缩写词,语义相互连接的词等.这些文件的内容很简单:单词!

现在,对于每个项目,我需要读取每个文件中的单词并将它们放入不同的数组中; 由于文件的内容从未改变,因此在第一个项目之后,它成为一个常见但多余的任务.

所以,我所做的是创建了一个对象来读取每个文件并填充各个数组(对象的实例变量).然后我序列化了对象,然后为后面的项目,我简单地反序列化它们.我没有必要一次又一次地读取文件并填充数组.


Poo*_*ool 5

从本质上讲

序列化是将一组包含相互引用的对象实例转换为线性字节流的过程,然后可以通过套接字发送、存储到文件或简单地作为数据流进行操作

请参阅Wiki的用途:

序列化有很多优点。它提供:

  1. 一种持久保存对象的方法,比将其属性写入磁盘上的文本文件并通过读回重新组装它们更方便。
  2. 发出远程过程调用的方法,例如 SOAP 中的方法
  3. 一种分发对象的方法,尤其是在 COM、CORBA 等软件组件中。
  4. 一种检测时变数据变化的方法。