使用Serializable而不是写入和读取对象到文件

在哪些情况下,使用实现可序列化而不是写入和读取对象到/从文件是一个很好的编码实践。在一个项目中我经历了代码。 使用implements serializable的类,即使在该类/项目中没有任何写入/读取对象到/从文件?

如果对象离开了创建它的JVM,那么该类应该实现Serializable。

序列化是一种方法,通过该方法,对象可以表示为包含对象数据的字节序列,以及有关对象类型和对象中存储的数据类型的信息。

将序列化对象写入文件后,可以从文件中读取并反序列化,即表示对象及其数据的类型信息和字节可用于在内存中重新创建对象。

这是反序列化的主要目的。 从对象的书面(松散地)表示中获取对象信息,对象类型,变量类型信息。 因此,首先需要序列化,以实现这一目标。

因此,无论何时,您的对象都有可能离开JVM,程序正在执行,您应该创建类,实现Serializable。

读取/写入对象到文件(内存),或通过Internet或任何其他类型的连接传递对象。 每当对象离开创建它的JVM时,它应该实现Serializable,这样一旦它回到另一个/同一个JVM就可以被序列化和反序列化以进行识别。

很多好读:

  • 1: 为什么Java需要Serializable接口?
  • 2: Java中序列化的目的是什么?

序列化的好处:

  1. 保留数据以备将来使用。

  2. 使用客户端/服务器Java技术(如RMI,套接字编程等)将数据发送到远程计算机。

  3. 将对象展平为内存中的字节数组。

  4. 在群集中的服务器之间发送对象。

  5. 在applet和servlet之间交换数据。

  6. 在Web应用程序中存储用户会话

  7. 激活/钝化企业java bean。

您可以参考这篇文章了解更多详情。

如果您希望您的对象在RMI设置中用作数据,则它们应该是可序列化的,因为RMI要么需要Serializable对象(如果它们要被序列化并发送到远程端),或者如果需要,则需要是UnicastRemoteObject远程参考。

在Java的早期版本中(在Java 5之前),标记接口是声明元数据的好方法,但是目前我们有注释,它们更强大地为类声明元数据。

注释提供了非常灵活和动态的function,我们可以提供注释元详细信息的配置,我们要么以字节代码或在运行时发送该信息。

这里如果您不愿意读取和写入对象,那么序列化还有一个目的是,为类声明元数据,如果您是为类声明元数据,那么我建议您不要使用序列化只是去注释。

注释是比标记接口更好的选择,JUnit是使用注释的完美示例,例如@Test用于指定测试类。 使用测试标记界面也可以实现相同。

还有一个例子表明Annotations是更好的选择@ThreadSafe看起来比实现ThraedSafe标记接口要好得多。

在其他情况下,您希望按值而不是按引用发送对象:

  • 通过网络发送对象。

这里不能通过引用真正发送对象。

  • multithreading,特别是在Android中

Android使用Serializable / Parcelable在Activities之间发送信息。 它与内存映射和multithreading有关。 我不是真的明白这一点。

除了Martin C的回答,我想补充一点 – 如果您使用Serializable那么您可以轻松地将Object图加载到内存中。 例如,你有一个具有DeportmentStudentclass。 因此,如果您序列化您的Student那么该Department也会被保存。 此外它还允许你 –

1.重命名序列化类中的变量,同时保持向后兼容性。
2.从新版本中的已删除字段访问数据(换句话说,在保持向后兼容性的同时更改数据的内部表示)。

某些框架/环境可能依赖于可序列化的数据对象。 例如,在J2EE中HttpSession属性必须是可序列化的,以便从Session Persistence中受益。 此外, RMI和其他黑暗时代的工件使用序列化。

因此,尽管您可能不会立即需要将数据对象序列化,但是为了以防万一声明Serializable可能是有意义的(它几乎是免费的,除非您需要经历声明readObject / writeObject方法的痛苦)