我正在进行一些代码审查,并遇到了包含非可序列化字段的可序列化类。该字段既未声明为 transient 。这种代码可以被称为代码气味。如果是,那么为什么?
public class A implements Serializable{
private B field ; // B is non serializable
}
答案 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
不是可序列化的。这是代码味道。