我已经阅读了很多关于序列化的文章以及它如何如此美妙和精彩,但没有一个论点足够令人信服。我想知道是否有人能真正告诉我通过序列化一个类我们能真正实现的目标是什么?
答案 0 :(得分:173)
让我们首先定义序列化,然后我们可以讨论它为什么如此有用。
序列化只是将现有对象转换为字节数组。此字节数组表示对象的类,对象的版本以及对象的内部状态。然后可以在运行相同代码的JVM之间使用此字节数组来传输/读取对象。
我们为什么要这样做?
有几个原因:
通信:如果你有两台运行相同代码的机器,并且需要进行通信,一台机器可以通过简单的方法构建一个包含想要传输的信息的对象,然后将其序列化反对另一台机器。这不是最好的沟通方式,但它可以完成工作。
持久性:如果要将特定操作的状态存储在数据库中,可以将其轻松序列化为字节数组,并存储在数据库中以供日后检索。
深层复制:如果您需要一个完全的Object副本,并且不想去编写自己的专用clone()类,那么只需序列化该对象到一个字节数组,然后将它反序列化到另一个对象实现了这个目标。
缓存:真的只是上面的一个应用程序,但有时一个对象需要10分钟才能构建,但是只需要10秒钟来反序列化。因此,不要抓住内存中的巨大对象,而是通过序列化将其缓存到文件中,并在以后需要时将其读取。
交叉JVM同步:序列化适用于可能在不同体系结构上运行的不同JVM。
答案 1 :(得分:53)
在运行应用程序时,其所有对象都存储在内存(RAM)中。当您退出时,操作系统将回收该内存,并且您的程序基本上“忘记”运行时发生的所有事情。序列化可以通过让您的应用程序将对象保存到磁盘来解决这个问题,以便它可以在下次启动时将其读回。如果您的应用程序将提供保存/共享以前状态的任何方式,您将需要某种形式的序列化。
答案 2 :(得分:20)
我可以分享我的故事,我希望它会提供一些想法,为什么序列化是必要的。但是,您的问题的答案已经非常详细。
我有几个项目需要加载和读取一堆文本文件。这些文件包含停用词,生物医学动词,生物医学缩写词,语义相互连接的词等。这些文件的内容很简单:单词!
现在,对于每个项目,我需要读取每个文件中的单词并将它们放入不同的数组中;由于文件的内容从未改变,因此在第一个项目之后,它成为一个常见但多余的任务。
所以,我做的是创建了一个对象来读取每个文件并填充单个数组(对象的实例变量)。然后我序列化了对象,然后为后面的项目,我简单地反序列化它们。我没有必要一遍又一遍地读取文件并填充数组。
答案 3 :(得分:3)
序列化是一个过程 转换一组对象实例 包含彼此的引用 成为线性字节流,其中 然后可以通过套接字发送, 存储到文件中,或简单地存储 被操纵为数据流
请参阅Wiki的使用情况:
序列化具有许多优点。它提供:
- 一种持久化物体的方法 比写作更方便 它们的属性为文本文件 磁盘,并重新组装它们 读回来。
- 一种方法 发出远程过程调用, 例如,如在SOAP
中- 一种方法 分配对象,特别是在 软件组件,如COM, CORBA等
- 检测方法 时变数据的变化。
醇>
答案 4 :(得分:1)
最明显的是你可以通过网络传输序列化的类, 并且接收者可以构建原始实例的副本。同样, 您可以将序列化结构保存到文件系统。
另外,请注意序列化是递归的,因此您可以序列化整个异构 如果需要,一个膨胀的数据结构。
答案 5 :(得分:0)
序列化对象在空间中维护状态,它们可以通过网络,文件系统等传输......而且时间,它们可以比创建它们的JVM更长久。
有时这很有用。
答案 6 :(得分:0)
我使用序列化对象来标准化我传递给函数或类构造函数的参数。传递一个序列化bean比一长串参数更清晰。结果是代码更容易阅读和调试。
答案 7 :(得分:0)
为了学习的简单目的(注意,我说学习,我没说最好,甚至不好,但只是为了理解东西),你可以将数据保存到计算机上的文本文件中,然后有一个程序可以读取该信息,并且根据该文件,您可以让您的程序以不同的方式响应。如果你更高级,那么它不一定是txt文件,而是其他东西。
另一方面,序列化将事物直接放入计算机语言中。它就像你用西班牙语告诉西班牙语计算机一样,而不是用法语告诉它,强迫它学习法语,然后通过翻译所有内容将东西保存到其原生西班牙语中。不是技术最密集的答案,我只想尝试用通用语言格式创建一个可理解的例子。
序列化也更快,因为在Java中,对象在堆上处理,并且比在堆栈上表示为基元的时间要长得多。速度,速度,速度。从程序员的角度来看,文件处理较少。