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

the*_*ava 143 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;
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. Serializable什么时候应该实现界面?
  2. 我们为什么这样做?
  3. 它是否具有任何优势或安全性?

mar*_*cog 148

  1. 这个"序列化"的事情到底是什么?:

    它允许您获取一个对象或一组对象,将它们放在磁盘上或通过有线或无线传输机制发送它们,然后,可能在另一台计算机上,反转该过程:恢复原始对象.基本机制是将对象展平为一维比特流,并将该比特流转换回原始对象.

    就像"星际迷航"中的转运者一样,它只是将一些复杂的东西变成一个1和0的平坦序列,然后取1和0的序列(可能在另一个地方,可能在另一个时间)并重建原始复杂的"东西".

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

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

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

  • @theJava这不是最佳实践的问题.这是一个关于你是否需要一系列字节的问题. (8认同)
  • 使用JSON时,您不必实现此接口,只需发送该字符串..所以我仍然不确定为什么在使用JSON时可以使用此接口. (5认同)
  • 对所有域模型实施可串行接口是最佳实践吗? (4认同)

Ste*_*son 44

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

  2. Serializable 当您想要保留它们的实例或通过网络发送它们时,类很有用.

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


Rae*_*ald 20

这个问题的答案可能是令人惊讶的, 只有当您被迫与遗留代码进行互操作时,才会永远或更现实.这是Joshua Bloch 在Effective Java,3rd Edition中的建议:

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

甲骨文的首席架构师Mark Reinhold表示,删除当前的Java序列化机制是一项长期目标.


为什么Java序列化存在缺陷

Java通过使用Serializable接口提供了您可以选择的序列化方案作为语言的一部分.然而,这种方案有几个棘手的缺陷,应该被Java语言设计者视为失败的实验.

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

该怎么做

相反,使用可以显式控制的序列化方案.例如Protocol Buffers,JSON,XML或您自己的自定义方案.

  • 不是那个级别的专家,但觉得你有道理。 (3认同)
  • 我认为这是最好的答案! (3认同)