1

我正在做一些代码审查,并遇到了包含不可序列化字段的可序列化类。该字段既未声明为transient。这种代码可以称为代码气味。如果是,那为什么?

public class A implements Serializable{

 private B field ; // B is non serializable

}
4

4 回答 4

5

如果对象的执行时间类型不是可序列化的,那么当您尝试对其进行序列化时,它将引发异常。

例如,这确实序列化:

导入java.io.*;

public class Test implements Serializable {
    private Object object;

    public static void main(String[] args) throws Exception {
        Test test = new Test();
        test.object = "";
        // Now serialize test
    }
}

这将创建一个适当的文件 - 但如果test.object设置为new Object(),那么它将引发异常。

这不仅仅是代码气味 - 这是一个错误,除非B是抽象类并且所有具体子类都是可序列化的......或者如果你知道它永远不会被序列化的其他方式,除非它的值field是可序列化的或 null。

于 2013-03-08T04:52:36.643 回答
1

当您尝试序列化对象时,这将产生异常(除非该字段为空,或者实际对象属于 的可序列化子类B)。

您必须使其成为瞬态或可序列化的(或实现您自己的序列化方法)。

于 2013-03-08T04:53:19.477 回答
0

不是字段,而是该字段指向的对象可能会导致 NotSerializableException。例如,如果field为 null,则不会有异常。或者,如果field指向 C 的实例,它是 B 的 Serializable 子类,也不例外。

于 2013-03-08T05:03:56.477 回答
-1

如果您尝试序列化,这将导致错误A。因为B不可序列化。这是代码气味。

于 2013-03-08T04:53:06.610 回答