39

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

根据 Java 文档中的 Serializability :

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

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

4

4 回答 4

47

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

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

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

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

此外,您不能再说:MySuperSecretClassis not serializable(通过简单地不实现Serializable)-您只能排除胆量(字段)。

于 2012-07-22T12:17:23.707 回答
16

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

2. java.lang.Object 没有实现 Serializable 的原因是,如果你不想将某些字段设置为 Serializable 并且我的错误错过了向该字段添加瞬态,那将会造成严重破坏。

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

于 2012-07-22T12:25:46.763 回答
5

大多数类不需要可序列化。使用当前的设计,您可以很容易地注意到该类是可序列化的。本质上,它只是一个经过编译器检查的自文档。否则你可能会写如下内容:

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

最好有语言或库功能而不是评论。

于 2012-07-22T12:20:51.603 回答
1

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

于 2012-07-22T12:25:03.550 回答