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


153
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. 它具有任何优势或安全性吗?

1
仅供参考,此处接受的答案不完整且具有误导性,因为它没有解决安全缺陷。请参阅有效的Java项目86:非常谨慎地实现Serializable。 Raedwald在这里的回答是说不使用序列化是正确的。
内森·休斯

Answers:


157
  1. 这是什么“系列化”的事情怎么一回事?

    它使您可以获取一个对象或一组对象,将它们放置在磁盘上或通过有线或无线传输机制发送,然后稍后,也许在另一台计算机上,逆转该过程:恢复原始对象。基本机制是将一个或多个对象展平为一维的位流,并将该位流转换回原始对象。

    就像《星际迷航》中的“运输工具”一样,所有操作都是将复杂的东西变成1和0的平面序列,然后再取1和0的序列(可能在另一个地方,可能在另一个时间),然后重构原始的复杂“东西。”

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

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

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


4
对所有域模型实现可串行化接口是一种最佳实践吗?
Java

8
@theJava这不是最佳实践的问题。这是您是否需要一系列字节的问题。
moinudin

5
使用JSON时,您不必实现此接口,而只需发送该字符串即可。因此,我仍然不确定为什么可以使用JSON时为何使用此接口。
Yonatan Nir

1
@YonatanNir我不确定当MsgPack,Avro,Thrift或Protobuf更适合IO传输时,为什么会使用JSON。
OneCricketeer

1
@YonatanNir严格定义的架构更好。JSON意味着人类可读,而二进制编码格式的传输效率要高得多
OneCricketeer

48
  1. 实现Serializable当你想能够一类的实例转换为一系列字节,或者当你认为一个界面Serializable对象可能引用您的类的实例。

  2. Serializable 当您要保留它们的实例或通过电线发送它们时,这些类很有用。

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


32

仅当您被迫与遗留代码实现互操作性时,此问题的答案才可能令人惊讶,甚至 永远不会或更现实。这是Joshua Bloch 在有效Java,第三版中的建议:

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

甲骨文首席架构师马克·莱因霍尔德(Mark Reinhold)表示,取消当前的Java序列化机制是一项长期目标。


为什么Java序列化存在缺陷

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

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

该怎么做

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


2
在那个级别上没有多少专家,但是觉得您有观点。
nightfury

1
我认为这是最好的答案!
jjanczur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.