什么是" Serializable"背后的基本原理。接口?

时间:2015-02-24 05:08:06

标签: java serialization serializable externalizable

如果我们想要序列化一个对象,我们可以简单地执行以下实现:

class MyClass implements Serializable
{
  private static final long serialVersionUID = 12345L;
}

不需要额外的努力来强制实现如何将对象写入文件和从文件中读取。 Java只关注一切。

另一方面,Externalizable确实定义了显式序列化和反序列化方法,因此我们可以强制编程。

这给我留下了一个问题:如果Serializable不需要额外的努力,那么使它成为我们必须实现的序列化/反序列化对象的接口的基本原理是什么,而不是默认情况下使每个对象可以序列化/反序列化吗?

3 个答案:

答案 0 :(得分:4)

当程序员将类标记为Serializable时,他负责如果此类将来发生更改,则保存对象的程序将能够将它们读回更新的类。详细信息在Effective Java Item 74:明智地实现Serializable

还有另一个理由。您是否注意到ObjectOutput.writeObject(Object obj)接受了Object而不是Serializable?这是因为它假定可以使用不同的序列化机制保存对象。 Serializable表示应该使用Java标准序列化保存对象

答案 1 :(得分:0)

Serializable接口仅作为识别掩码。如果每个类都有 具有序列化的能力,然后每个类都需要维护serialVersionUID以避免版本冲突。此外,它可能会导致安全问题:有人会将其用作创建新对象的方法,尽管 该对象不是由客户端代码创建的。使用Serializable接口并不安全。有关更多信息,请参阅Effective Java。

答案 2 :(得分:0)

由于:

  1. 并非所有对象都具有有意义的语义。示例:singleton object
  2. 安全。如果您将对象传递给其他人的代码并且他们总是可以捕获并传输对象,则需要选择退出安全相关代码,并且当人们忽略对象时会出现安全漏洞。所以"默认关闭"更安全。
  3. 内置的序列化格式会为您编写的每个对象写出类名,因此效率非常低。仅用于数据量很少的非常简单的情况。
  4. 默认序列化不会轻易与使用其他语言编写的代码共享数据,因此,如果今天编写的数据可能需要在将来由其他软件读取,则应考虑使用特定表示。所以它不是一个好的长期格式。
  5. 所有开发人员都没有记住它在所有情况下如何工作的确切规则。
  6. 如果您阅读了Joshua Bloch撰写的 Effective Java书,它解释了使用内置功能的难度。大多数开发人员在很多情况下都会避开它。这个答案给出了一个很好的经验法则https://softwareengineering.stackexchange.com/a/240432/129659