Java 如果可序列化类中存在不可序列化字段,会产生什么影响?
我正在做一些代码复查,遇到了一个可序列化的类,它包含一个不可序列化的字段。该字段既不声明为瞬态字段。这种代码可以称为代码气味吗。如果是,为什么Java 如果可序列化类中存在不可序列化字段,会产生什么影响?,java,serialization,Java,Serialization,我正在做一些代码复查,遇到了一个可序列化的类,它包含一个不可序列化的字段。该字段既不声明为瞬态字段。这种代码可以称为代码气味吗。如果是,为什么 public class A implements Serializable{ private B field ; // B is non serializable } 如果对象的执行时间类型不可序列化,则在尝试序列化它时,它将引发异常 例如,这会序列化: 导入java.io.* public class Test implements Seri
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
设置为newobject()
,那么它将抛出异常
这不仅仅是一种代码味道——它是一个bug,除非
B
是一个抽象类,并且所有具体的子类都是可序列化的。。。或者,如果您知道某种其他方式,除非字段
的值可序列化或为空,否则它将永远不会序列化。如果对象的执行时间类型不可序列化,则当您尝试序列化它时,它将抛出异常
例如,这会序列化:
导入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
设置为newobject()
,那么它将抛出异常
这不仅仅是一种代码味道——它是一个bug,除非
B
是一个抽象类,并且所有具体的子类都是可序列化的。。。或者,如果您知道某种其他方式,除非字段的值可序列化或为空,否则它将永远不会序列化。如果您尝试序列化A
,这将导致错误。因为B
不可序列化。这是代码气味。如果您尝试序列化A
,这将导致错误。因为B
不可序列化。这是代码气味。当您尝试序列化对象时,这将产生异常(除非字段为null,或者实际对象属于B
的可序列化子类)
您必须使其暂时或可序列化(或实现您自己的序列化方法)。当您尝试序列化对象时,这将产生异常(除非字段为null,或者实际对象属于B
的可序列化子类)
您必须使其暂时或可序列化(或实现您自己的序列化方法)。不是字段,而是该字段指向的对象可能导致NotSerializableException。
例如,如果字段
为空,则不会出现异常。或者,如果字段
指向一个C实例,该实例是B的可序列化子类,则不会出现异常。该字段指向的对象可能导致NotSerializableException,而不是字段。
例如,如果字段
为空,则不会出现异常。或者,如果field
指向C的一个实例,它是B的一个可序列化的子类,那么也不会例外。现在,我几乎把序列化本身称为代码气味。;-)@极客,你的问题是问题的标题或其他什么。这些天来,我几乎把序列化本身称为一种代码味道@极客你的问题是问题的标题或其他什么。当你做test.object=“”代码>?对象可能不是字符串?@Geek:这就是问题所在-当您使用“
”时,这很好,因为字符串是可序列化的。。。然而,如果将test.object
设置为不可序列化的对象(例如newobject()
),则test
的序列化将失败代码>?对象可能不是字符串?@Geek:这就是问题所在-当您使用“
”时,这很好,因为字符串是可序列化的。。。然而,如果将test.object
设置为不可序列化的对象(例如new object()
),则test
的序列化将失败。仅当B引用的实际类型不可序列化时。查看其他答案。没有IF。问题已经说明了B引用的类型不可序列化。仅当B引用的实际类型不可序列化时。查看其他答案。没有IF。问题已经表明B引用的类型是不可序列化的。