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

我已经阅读了很多关于序列化的文章,以及它如何如此美好和伟大,但是没有任何论据足够令人信服。 我想知道如果有人能真正告诉我,我们可以通过序列化一个类真正实现什么?

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

序列化只是将现有的对象转换成一个字节数组。 这个字节数组表示对象的类,对象的版本和对象的内部状态。 这个字节数组可以在JVM运行相同的代码之间使用来传输/读取对象。

我们为什么要这样做?

有几个原因:

  • 通信:如果你有两台机器运行相同的代码,并且需要进行通信,那么一个简单的方法就是让一台机器创build一个想要传输信息的对象,然后将该对象序列化到另一台机器上。 这不是沟通的最佳方法,但它可以完成工作。

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

  • 深度复制:如果您需要一个对象的完全副本,并且不想去编写自己专门的clone()类的麻烦,只需将该对象序列化为一个字节数组,然后将其反序列化为另一个对象达到这个目标。

  • caching:真的只是上面的一个应用程序,但有时一个对象需要10分钟的时间来构build,但是只需要10秒就可以反序列化。 所以,而不是坚持内存中的巨大对象,只需要通过序列化将其caching到文件中,并在需要时再读取。

  • 跨JVM同步:串行化适用于可能在不同架构上运行的不同JVM。

运行应用程序时,其所有对象都存储在内存(RAM)中。 当你退出时,内存被操作系统回收,而你的程序本质上“忘记”运行时发生的一切。 序列化通过让应用程序将对象保存到磁盘来解决这个问题,以便在下一次启动时读取它们。 如果您的应用程序将提供任何方式来保存/共享以前的状态,您将需要某种forms的序列化。

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

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

现在对于每个项目,我都需要读取每个文件中的文字,并将它们放入不同的数组中; 因为文件的内容从来没有改变过,所以在第一个项目之后,它变成了一个常见的,但是是多余的任务。

所以,我所做的是创build一个对象来读取这些文件中的每一个,并填充单个数组(对象的实例variables)。 然后,我序列化的对象,然后为后来的项目,我只是反序列化它们。 我不必读取文件并一次又一次地填充数组。

在本质上 :

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

查看Wiki的用途:

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

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

在想要保存对象状态并将该对象转换为字节stream的情况下使用序列化,需要对对象进行序列化。 在运行应用程序时,其所有对象都存储在内存中(堆内存)。 当你退出时,内存被操作系统回收,而你的程序本质上“忘记”运行时发生的一切。 在这种情况下,可以通过让应用程序将对象保存到磁盘来使用序列化,以便在下次启动时读取它们。 如果您的应用程序将提供任何方式来保存/共享以前的状态,您将需要某种forms的序列化。

每当一个对象必须通过networking发送时,这些对象应该被序列化。 例如,如果您有两台机器运行相同的代码,并且需要进行通信,则一个简单的方法是让一台机器用想要传输的信息构build一个对象,然后将该对象序列化到另一台机器。 这不是沟通的最佳方法,但是它可以完成序列化工作。

跨JVM同步 – 串行化适用于可能在不同架构上运行的不同JVM Java虚拟机。

最明显的是你可以通过networking传输序列化的类,而接收者可以构造原始实例的副本。 同样,您可以将序列化结构保存到文件系统。

此外,请注意,序列化是recursion的,所以如果需要,您可以将整个异构数据结构序列化为一个swell foop。

序列化的对象保持空间状态,可以通过networking,文件系统等等和时间传输,它们可以超越创build它们的JVM。

有时这是有用的。

我使用序列化对象来标准化我传递给函数或类构造函数的参数。 传递一个序列化的bean比一长串参数要干净得多。 结果是代码更容易阅读和debugging。

为了学习的简单目的(注意,我说的是学习,我没有说最好的,甚至是好的,但只是为了理解的东西),你可以将你的数据保存到电脑上的文本文件,然后有一个程序读取该信息,并基于该文件,你可以让你的程序有不同的反应。 如果你更高级,它不一定是一个txt文件,而是其他的东西。

另一方面,串行化,把东西直接放入计算机语言。 这就像你用西class牙文告诉西class牙语的电脑,而不是用法语来讲它,强迫它学习法语,然后把所有东西都翻译成西class牙语。 不是技术密集程度最高的答案,我只是试图用通用语言格式创build一个可以理解的例子。

序列化的速度也更快,因为在Java中,对象在堆上处理,花费的时间比在堆栈上表示为基元要长得多。 速度,速度,速度。 从程序员的angular度来看,文件处理较less。