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引用的类型是不可序列化的。