如果Serializable类中存在非序列化字段会有什么影响?

时间:2013-03-08 04:51:09

标签: java serialization

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

public class A implements Serializable{

 private B field ; // B is non serializable

}

4 个答案:

答案 0 :(得分:5)

如果对象的执行时间类型不可序列化,则在尝试序列化时会抛出异常。

例如, 序列化:

import 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,否则我知道它永远不会被序列化的其他方式。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

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