bon*_*iek 7 java serialization findbugs
从描述SE_BAD_FIELD:
可序列化类中的非瞬态非可序列化实例字段
此Serializable类定义非原始实例字段,该字段既不是瞬态的,也不是序列化的,也不是java.lang.Object,并且似乎不实现Externalizable接口或readObject()和writeObject()方法.如果在此字段中存储非Serializable对象,则不会正确反序列化此类的对象.
为什么java.lang.Object规则是例外?
因为所有东西都可以反序列化回 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 出现的情况。
| 归档时间: |
|
| 查看次数: |
7942 次 |
| 最近记录: |