为什么Java.lang.Object没有实现Serializable接口?

时间:2012-07-22 12:14:51

标签: java serializable

  

可能重复:
  Why Java needs Serializable interface?

根据Java docs中的Serializability:

  

类的可序列化由实现该类的类启用   java.io.Serializable接口。没有实现此功能的类   接口不会将其任何状态序列化或反序列化。   可序列化类的所有子类型本身都是可序列化的。该   序列化接口没有方法或字段,仅用于   确定可序列化的语义

为什么对象已经实现Serializable?我们不希望序列化的成员可以被设为transient。为什么要阻止默认的Serializability?

4 个答案:

答案 0 :(得分:41)

  

可序列化类的所有子类型本身都是可序列化的。

换句话说:您创建,创建或将要创建的所有类都是可序列化的。 transient只排除字段,而不是整个类。

这是一个潜在的安全漏洞 - 巧合的是你可以序列化,例如您的DataSource内置数据库凭据 - 如果此特定DataSource实施的创建者忘记创建此类字段transient。序列化随机Java对象非常容易,例如:通过内部类保存对外部this的隐式引用。

使用您明确需要的类的白名单并允许序列化而不是仔细检查您的代码,确保没有任何您不希望的字段被序列化,这样更安全。

此外,您无法再说:MySuperSecretClass不可序列化(只是不实施Serializable) - 您只能排除胆量(字段)。

答案 1 :(得分:13)

1。 Serializable标记接口,它是空的,但是当一个类被标记为Serializable时,意味着它的对象是Serializable。

2。 java.lang.Object没有实现Serializable的原因是因为,如果你不想将某些字段设为Serializable并且你错误地将错误添加到该字段,那将是一场浩劫。

3。通过让程序员为他的类实现Serializable,它使程序员意识到他有意识地实现了它,并且应该采取必要的步骤来防止任何序列化,这不应该是

答案 2 :(得分:5)

大多数类不需要可序列化。使用当前设计,您可以轻松地注意到该类是可序列化的。基本上它只是一个编译器检查的自我文档。否则你可能会写一些类似的东西:

/** DON'T SERIALIZE IT!!! */
class Connection { ... }

并且拥有语言或图书馆功能比评论更好。

答案 3 :(得分:1)

我认为对需要持久化的对象实现Serializable更有意义,并且声明类transiennt的每个字段都会更麻烦。我不确定的另一点是Object是所有类的根,包括与反射相关的类,因此为Object类实现Serializable是不合适的。