我正在做一些代码审查,并遇到了包含不可序列化字段的可序列化类。该字段既未声明为transient。这种代码可以称为代码气味。如果是,那为什么?
public class A implements Serializable{
private B field ; // B is non serializable
}
我正在做一些代码审查,并遇到了包含不可序列化字段的可序列化类。该字段既未声明为transient。这种代码可以称为代码气味。如果是,那为什么?
public class A implements Serializable{
private B field ; // B is non serializable
}
如果对象的执行时间类型不是可序列化的,那么当您尝试对其进行序列化时,它将引发异常。
例如,这确实序列化:
导入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。
当您尝试序列化对象时,这将产生异常(除非该字段为空,或者实际对象属于 的可序列化子类B
)。
您必须使其成为瞬态或可序列化的(或实现您自己的序列化方法)。
不是字段,而是该字段指向的对象可能会导致 NotSerializableException。例如,如果field
为 null,则不会有异常。或者,如果field
指向 C 的实例,它是 B 的 Serializable 子类,也不例外。
如果您尝试序列化,这将导致错误A
。因为B
不可序列化。这是代码气味。