What is the purpose of Serialization in Java?

I have read quite a number of articles on Serialization and how it is so nice and great but none of the arguments were convincing enough. I am wondering if someone can really tell me what is it that we can really achieve by serializing a class?

109192 次浏览

最明显的是,您可以通过网络传输序列化类, and the recepient can construct a duplicate of the original instanstance. Likewise, 可以将序列化结构保存到文件系统。

另外,请注意序列化是递归的,因此您可以序列化整个异构 数据结构在一个膨胀足球,如果需要。

从本质上说:

序列化是 转换一组对象实例 包含对彼此的引用 变成一个线性字节流,其中 can then be sent through a socket, 存储到文件中,或者简单地 manipulated as a stream of data

参见 维基百科的用法:

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

  1. 保存对象的方法 is more convenient than writing 上的文本文件 磁盘,并重新组装它们 把这个读回去。
  2. 某种方法 发出远程过程调用, 例如,在 SOAP 中
  3. 一种... 的方法 分配对象,尤指在 基于组件的软件工程,例如 COM、, CORBA 等。
  4. a method for detecting 时变数据的变化。

序列化对象在空间中保持状态,它们可以通过网络、文件系统等进行传输。.和时间,它们可以比创建它们的 JVM 活得更久。

有时这是有用的。

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

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

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

我们为什么要这么做?

有几个原因:

  • Communication: If you have two machines that are running the same code, and they need to communicate, an easy way is for one machine to build an object with information that it would like to transmit, and then serialize that object to the other machine. It's not the best method for communication, but it gets the job done.

  • 持久性: 如果希望将特定操作的状态存储在数据库中,可以很容易地将其序列化为字节数组,并存储在数据库中以便以后检索。

  • Deep Copy: 如果你需要一个对象的 一模一样副本,并且不想麻烦地编写你自己的专门克隆()类,只需序列化对象到一个字节数组,然后反序列化它到另一个对象就可以达到这个目的。

  • 缓存: 实际上只是上面提到的一个应用程序,但是有时候构建一个对象需要10分钟,但是反序列化只需要10秒。因此,与其在内存中保留这个巨大的对象,不如通过序列化将其缓存到一个文件中,然后在需要时将其读入。

  • 跨 JVM 同步: 序列化可以跨不同的 JVM 工作,这些 JVM 可能运行在不同的体系结构上。

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

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

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

因此,我所做的就是创建一个对象来读取这些文件中的每一个并填充单独的数组(对象的实例变量)。然后我序列化了这些对象,然后对于后面的项目,我只是反序列化了它们。我不必一遍又一遍地读取文件并填充数组。

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

为了学习的简单目的(注意,我说的是学习,我没有说最好,甚至是最好,但只是为了理解的东西) ,你可以保存你的数据到一个文本文件在计算机上,然后有一个程序读取这些信息,根据文件,你可以有你的程序的反应不同。如果您更高级一些,那么它不一定非得是一个 txt 文件,而是一些其他的东西。

Serializing on the other hand, puts things directly into computer language. It's like you're telling a Spanish computer something in Spanish, rather than telling it something in French, forcing it to learn French, then save things into its native Spanish by translating everything. Not the most tech-intensive answer, I'm just trying to create an understandable example in a common language format.

序列化也更快,因为在 Java 中,对象是在堆上处理的,所花的时间比在堆栈上表示为原语要长得多。速度,速度,速度。而且从程序员的角度来看,文件处理更少。

在日常生活中使用序列化的经典例子之一是任何电脑游戏中的“保存游戏”选项。当玩家决定保存他在游戏中的进度,然后应用程序写的保存状态的游戏通过序列化到一个文件,当玩家“加载游戏”的序列化文件读取和游戏状态是重新创建。