FindBugs - SE_BAD_FIELD规则,为什么忽略java.lang.Object?

bon*_*iek 7 java serialization findbugs

从描述SE_BAD_FIELD:

可序列化类中的非瞬态非可序列化实例字段

此Serializable类定义非原始实例字段,该字段既不是瞬态的,也不是序列化的,也不是java.lang.Object,并且似乎不实现Externalizable接口或readObject()和writeObject()方法.如果在此字段中存储非Serializable对象,则不会正确反序列化此类的对象.

为什么java.lang.Object规则是例外?

Jbe*_*erg 2

因为所有东西都可以反序列化回 java.lang.Object,因为 java 中的每个类都扩展了 java.lang.Object。如果您设法序列化具有不可序列化字段的对象,则您无法在反序列化时知道该字段的类。因为每个类都是一个对象,所以您始终可以依赖于 Object 类。

    class NonSerializableUser {}
    class SerializableUser implements Serializable{}

    class SomeObject implements Serializable{
        public NonSerializableUser nonUser;
        public SerializableUser user;
        public Object nonUserObj;

        public SomeObject(SerializableUser u, NonSerializableUser uu, NonSerializableUser uuu){
            user = u;
            nonUser = uu;
            nonUserObj = uuu;
       }
    }
Run Code Online (Sandbox Code Playgroud)

在此示例中,反序列化此类将导致 nonUser 为 null,user 为正确的 SerializedUser 类实例,nonUserObj 将为非 null,但它将丢失所有 NonSerializedClass 方法和字段,它们不会被序列化。该实例中唯一被序列化的部分是属于 Object 的方法和字段。

值得注意的是,许多序列化库(例如 ObjectOutputStream)会抱怨不可序列化的类,并且不会首先序列化该对象。这就是为什么我省略了序列化/反序列化步骤的细节。然而,许多 xml 框架仍然会序列化这些类,这往往就是这个 bug 出现的情况。