我已经阅读了很多关于串行化的文章,它被描述为非常好和伟大,但是没有一个论点能够令人信服。我想知道通过对类进行序列化我们到底能够实现什么?
我已经阅读了很多关于串行化的文章,它被描述为非常好和伟大,但是没有一个论点能够令人信服。我想知道通过对类进行序列化我们到底能够实现什么?
首先,让我们定义一下序列化,然后再谈为什么它非常有用。
序列化就是将现有对象转换为字节数组。这个字节数组表示对象的类别、版本和内部状态。然后可将此字节数组在运行相同代码的JVM之间用于传输/读取对象。
我们为什么要这样做呢?
有几个原因:
通信:如果有两台运行相同代码的机器需要通信,一个简单的方法是一台机器构建一个包含要传输信息的对象,然后将该对象序列化到另一台机器。这不是最好的通信方法,但它能够完成工作。
持久性:如果你想要将特定操作的状态存储在数据库中,可以将其轻松序列化成字节数组,并存储在数据库中以供以后检索。
深度复制:如果你需要一个精确的对象副本,并且不想费力编写自己的专门clone()类,只需将对象序列化为字节数组,然后重新反序列化为另一个对象即可实现此目标。
缓存:实际上只是上面的应用,但有时一个对象需要花费10分钟来构建,但只需要花费10秒钟来反序列化。因此,不要将巨型对象保存在内存中,而是通过序列化将其缓存到文件中,在以后需要时进行读取。
跨JVM同步:序列化可以跨不同架构的不同JVM运行。
当您运行应用程序时,它的所有对象都存储在内存(RAM)中。当您退出应用程序时,操作系统会回收该内存,并且您的程序基本上会“忘记”其运行过程中发生的一切。序列化通过让应用程序将对象保存到磁盘上来解决这个问题,以便下次启动应用程序时可以读取它们。如果您的应用程序要提供任何保存/共享之前状态的方式,则需要某种形式的序列化。
我可以分享我的经历,希望它能够让你理解为什么序列化是必要的。但是,你问题的答案已经非常详细了。
我有几个项目需要加载并读取一堆文本文件。这些文件包含停用词、生物医学动词、生物医学缩写、语义相关联的单词等等。这些文件的内容很简单:单词!
现在,对于每个项目,我需要从每个文件中读取单词并将它们放入不同的数组中;由于文件的内容从未改变,所以在第一个项目之后,这成为了一个常见但多余的任务。
因此,我的做法是创建一个对象来读取这些文件并填充各个数组(对象的实例变量)。然后,我对这些对象进行序列化,以便在以后的项目中,我只需进行反序列化即可,而不必再次读取文件和填充数组。
序列化是将包含相互引用的一组对象实例转换为线性字节流的过程,然后可以通过套接字发送、存储到文件中或仅作为数据流进行操作。
从维基百科查看用途:
序列化具有许多优点。它提供了以下功能:
- 比将对象属性写入磁盘上的文本文件并通过读取来重新组装更方便的对象持久化方法。
- 一个发出远程过程调用的方法,例如SOAP。
- 在组件化软件中(如COM,CORBA等)分发对象的方法。
- 检测时变数据变化的方法。
我使用序列化对象来标准化传递给函数或类构造函数的参数。传递一个序列化的bean比长列表的参数更加简洁。结果是代码更易于阅读和调试。
为了简单学习的目的(请注意,我说的是学习,而不是最好或者甚至好的,而只是为了理解问题),您可以将数据保存到计算机上的文本文件中,然后有一个程序读取该信息,并基于文件,您可以使程序有不同的反应。如果您已经更进一步,它不一定要是txt文件,而是其他类型的文件。
另一方面,序列化直接将事物转换成计算机语言。就像您用西班牙语告诉一台西班牙计算机某些东西,而不是告诉它一些法语,强制它学习法语,然后通过翻译把所有内容保存到本地的西班牙语中。这不是最技术密集型的答案,我只是试图用通俗易懂的语言格式创造一个易于理解的例子。
序列化也更快,因为在Java中,对象在堆上处理,比作为栈上的原始元素处理需要花费更长的时间。速度,速度,速度。从程序员的角度来看,减少了文件处理。