根据 Java 文档中的 Serializability :
类的可序列化性由实现 java.io.Serializable 接口的类启用。未实现此接口的类将不会对其任何状态进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于识别可序列化的语义
为什么 Object 还没有实现Serializable
?我们不想被序列化的成员可以被设为transient
. 为什么要阻止默认的 Serializability?
根据 Java 文档中的 Serializability :
类的可序列化性由实现 java.io.Serializable 接口的类启用。未实现此接口的类将不会对其任何状态进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于识别可序列化的语义
为什么 Object 还没有实现Serializable
?我们不想被序列化的成员可以被设为transient
. 为什么要阻止默认的 Serializability?
可序列化类的所有子类型本身都是可序列化的。
换句话说:您曾经创建、曾经创建或将要创建的所有类都是可序列化的。transient
仅排除字段,而不是整个类。
这是一个潜在的安全漏洞 - 巧合的是DataSource
,如果这个特定DataSource
实现的创建者忘记创建这些字段,您可以在其中序列化例如您的数据库凭据transient
。序列化随机 Java 对象非常容易,例如通过内部类对外部对象进行隐式引用this
。
使用您明确想要并允许序列化的类的白名单更安全,而不是仔细检查您的代码,确保没有您不想要的字段被序列化。
此外,您不能再说:MySuperSecretClass
is not serializable(通过简单地不实现Serializable
)-您只能排除胆量(字段)。
1. Serializable
是marker interface,它是空的,但是当一个类被标记为Serializable时,意味着它的对象是Serializable。
2. java.lang.Object 没有实现 Serializable 的原因是,如果你不想将某些字段设置为 Serializable 并且我的错误错过了向该字段添加瞬态,那将会造成严重破坏。
3.通过让程序员为他的类实现Serializable,它让程序员意识到他已经有意识地实现了它,并且应该采取必要的措施来防止任何不应该被序列化的东西。
大多数类不需要可序列化。使用当前的设计,您可以很容易地注意到该类是可序列化的。本质上,它只是一个经过编译器检查的自文档。否则你可能会写如下内容:
/** DON'T SERIALIZE IT!!! */
class Connection { ... }
最好有语言或库功能而不是评论。
Serializable
我认为为需要持久化的对象实现更有意义,并且声明类的每个字段transiennt
会更麻烦。我不确定的另一点是Object
所有类的根,其中包括与反射相关的类,因此为 Object 类实现 Serializable 是不合适的。