非Serializable接口类型字段赋值Serializable实现类,序列化问题咨询
Java序列化常见问题解答
问题1:若类的字段为非Serializable接口类型,但其实际赋值的是Serializable实现类实例,该字段能否被序列化?
能。Java序列化机制判断对象是否可序列化,依据的是运行时实际对象的类型,而非声明时的接口类型。只要字段实际指向的对象实现了Serializable接口,就能正常被序列化。反之,如果实际对象没实现Serializable,序列化时会抛出NotSerializableException。
问题2:若序列化Parent类实例时,field3赋值为MyImplementation类实例,那么field4和field5是否会被一同序列化?
会。因为MyImplementation实现了Serializable接口,它的所有非static、非transient字段(包括field4和field5)都会被自动序列化——不管它是以MyInterface接口类型的引用被持有,还是以自身类类型被持有。
代码示例
public class Parent implements Serializable { public String field1; public String field2; public MyInterface field3; } public interface MyInterface { String getText(); } public class MyImplementation implements MyInterface, Serializable { private static final long serialVersionUID = 12345464324324L; public int field4; public int field5; @Override public String getText() { return "foo"; } }
内容的提问来源于stack exchange,提问作者Leszek Pachura
相关产品推荐
相关产品推荐

