什么时候应该实现Serializable接口?

时间:2010-12-28 19:26:00

标签: java serialization

public class Contact implements Serializable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  1. 我应该何时实施Serializable界面?
  2. 为什么我们这样做?
  3. 它是否有任何优势或安全性?

3 个答案:

答案 0 :(得分:141)

  1. 来自What's this "serialization" thing all about?

      

    它可以让你拍摄一个物体或一组   对象,将它们放在磁盘上或发送   他们通过有线或无线   运输机制,然后,   也许在另一台电脑上,反过来   过程:复活原件   (多个)对象。基本机制是   将对象展平成一个   一维比特流,以及   将那些比特流转回   原始对象。

         

    就像星际迷航中的转运者一样   这都是关于服用的东西   复杂并将其变成一个单位   1和0的序列,然后采取   1s和0s的序列(可能是   在另一个地方,可能在另一个地方   时间)和重建原始   复杂的“东西。”

    因此,当您需要存储对象的副本,将它们发送到在同一系统或网络上运行的另一个进程时,实现Serializable接口。

  2. 因为您想存储或发送对象。

  3. 它使存储和发送对象变得容易。它与安全无关。

答案 1 :(得分:41)

  1. 如果希望能够将类的实例转换为一系列字节,或者当您认为Serializable对象可能引用您的实例时,请实现Serializable接口类。

  2. Serializable类在您想要保留它们的实例或通过网络发送它们时非常有用。

  3. 可以轻松传输Serializable类的实例。但是,序列化确实会带来一些安全后果。阅读Joshua Bloch的“Effective Java”。

答案 2 :(得分:9)

这个问题的答案也许令人惊讶,从不,或者更现实的是,仅当您被迫与遗留代码实现互操作性时。这是Joshua Bloch在Effective Java, 3rd Edition中的建议:

  

没有理由在您编写的任何新系统中使用Java序列化

Oracle's chief architect, Mark Reinhold, is on record 表示删除当前的Java序列化机制是一个长期目标。


为什么Java序列化存在缺陷

Java通过使用Serializable接口,提供了您可以选择采用的序列化方案作为语言的一部分。但是,该方案存在一些难以克服的缺陷,应被Java语言设计者视为失败的实验。

  • 从根本上讲,人们可以谈论对象的 the 序列化形式。但是有无数种序列化方案,导致无数种序列化形式。通过实施一个方案,而无需任何更改方案的方法,应用程序将无法使用最适合他们的方案。
  • 它被实现为构造对象的附加手段,它绕过了构造函数或工厂方法执行的任何前提条件检查。除非编写棘手,容易出错且难以测试额外的反序列化代码,否则您的代码可能存在巨大的安全漏洞。
  • 测试不同版本的序列化表格的互操作性非常困难。
  • 处理不可变对象很麻烦。

该怎么做

相反,请使用可以显式控制的序列化方案。例如协议缓冲区,JSON,XML或您自己的自定义方案。