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

TJ-*_*TJ- 35 java serializable

可能重复:
为什么Java需要Serializable接口?

根据Java docs中的Serializability:

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

为什么Object没有实现Serializable?我们不希望可序列化的成员可以被制作为transient.为什么要阻止默认的Serializability?

Tom*_*icz 43

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

换句话说:所有你曾经创建类,已经或将要创建都是序列化的.transient只排除字段,而不是整个类.

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

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

此外,你不能再说:MySuperSecretClass不可序列化(只是没有实现Serializable) - 你只能排除胆量(字段).

  • @ TJ-:恕我直言,只需要一小部分类可序列化(值对象,DTO).标记需要序列化的类比标记那些不需要序列化的类更方便.并不是说Java在这方面并不繁琐:再次恕我直言,所有字段都应该是私有的,默认情况下所有方法都是公开的,但你能做什么? (3认同)

Kum*_*tra 13

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

2. java.lang.Object没有实现Serializable的原因是因为,如果你不想将某些字段设置为Serializable并且你错误地将错误添加到该字段,那么将会是一场严重的破坏.

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


vbe*_*nar 5

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

/** DON'T SERIALIZE IT!!! */
class Connection { ... }
Run Code Online (Sandbox Code Playgroud)

拥有语言或图书馆功能比评论更好.