为什么 Java.lang.Object 不实现可序列化接口?

2022-09-01 04:23:33

可能的重复:
为什么Java需要可序列化的接口?

根据 Java 文档中的可序列化性:

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

为什么对象尚未实现?我们不希望可序列化的成员可以设置为 .为什么要阻止默认的可序列化性?Serializabletransient


答案 1

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

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

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

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

此外,您不能再说:是不可序列化的(通过简单地不实现) - 您只能排除胆量(字段)。MySuperSecretClassSerializable


答案 2

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

2.java.lang.Object没有实现Serializable的原因是,如果你不想使某些字段成为可序列化字段,而你我的错误错过了向该字段添加瞬态,那么这将是一个严重破坏。

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


推荐