我已经读了很多关于序列化的文章,它是如此的好和很棒,但是没有一个论点令人信服。我想知道是否有人真的可以告诉我通过序列化类可以真正实现的目标?
我已经读了很多关于序列化的文章,它是如此的好和很棒,但是没有一个论点令人信服。我想知道是否有人真的可以告诉我通过序列化类可以真正实现的目标?
Answers:
让我们先定义序列化,然后再讨论为什么它如此有用。
序列化只是将现有对象转换为字节数组。此字节数组表示对象的类,对象的版本以及对象的内部状态。然后可以在运行相同代码的JVM之间使用此字节数组来传输/读取对象。
我们为什么要这样做?
有以下几个原因:
通信:如果您有两台运行相同代码的计算机,并且它们需要进行通信,则一种简单的方法是,一台计算机使用要传输的信息来构建对象,然后将该对象序列化到另一台计算机。这不是最佳的沟通方式,但可以完成工作。
持久性:如果要将特定操作的状态存储在数据库中,则可以轻松地将其序列化为字节数组,然后存储在数据库中以供以后检索。
深度复制:如果您需要对象的精确副本,并且不想麻烦编写自己的专门clone()类,只需将对象序列化为字节数组,然后将其反序列化为另一个对象可以实现此目标。
缓存:实际上只是上述应用程序,但有时一个对象需要10分钟的构建时间,而反序列化则只需10秒。因此,与其保留内存中的巨型对象,不如通过序列化将其缓存到文件中,并在以后需要时将其读入。
跨JVM同步:序列化可在可能在不同体系结构上运行的不同JVM之间进行。
在运行应用程序时,其所有对象都存储在内存(RAM)中。当您退出时,该内存将被操作系统回收,并且您的程序实质上会“忘记”运行时发生的所有事情。序列化通过让您的应用程序将对象保存到磁盘,以便下次启动时可以将其读回来解决此问题。如果您的应用程序将提供保存/共享先前状态的任何方式,则需要某种形式的序列化。
我可以分享我的故事,并希望它能提供一些为什么需要序列化的想法。但是,您的问题的答案已经非常详细。
我有几个项目需要加载和读取一堆文本文件。这些文件包含停用词,生物医学动词,生物医学缩写,彼此语义相关的词等。这些文件的内容很简单:单词!
现在,对于每个项目,我需要从每个文件中读取单词,并将它们放入不同的数组中。由于文件的内容从未更改,因此在第一个项目之后,它成为一项常见但又多余的任务。
因此,我要做的是创建了一个对象来读取每个文件并填充单个数组(对象的实例变量)。然后我序列化了对象,然后为以后的项目简单地反序列化了它们。我不必读取文件并一次又一次地填充阵列。
序列化的对象在空间中保持状态,可以通过网络,文件系统等进行传输……而且时间还可以,它们可以超过创建它们的JVM。
有时这很有用。
我使用序列化的对象来标准化传递给函数或类构造函数的参数。传递一个序列化的bean比一长串参数要干净得多。结果是更易于阅读和调试的代码。
为了学习的简单目的(注意,我说学习,我说的不是最好的,甚至不是很好的,只是为了理解东西),您可以将数据保存到计算机上的文本文件中,然后有一个程序读取该信息,并基于文件,您可以让程序做出不同的响应。如果您更高级,则不一定是txt文件,而是其他东西。
另一方面,序列化将事物直接放入计算机语言中。就像您是在用西班牙语告诉西班牙计算机,而不是用法语说,是强迫它学习法语,然后通过翻译所有内容将其保存为西班牙语。这不是技术密集程度最高的答案,我只是想以一种通用语言格式创建一个易于理解的示例。
序列化也更快,因为在Java中,对象是在堆上处理的,并且比在堆栈上将它们表示为原语的时间要长得多。速度,速度,速度。从程序员的角度来看,文件处理更少。