Java中ObjectStream传输User对象时父类Long类型ID为何为null?
为什么反序列化后的User对象id为null?
问题原因
- 父类
Entity未实现Serializable接口,而子类User实现了。Java序列化机制仅会处理实现Serializable接口的类的字段,未实现该接口的父类字段不会被写入序列化流。 - 反序列化时,对于未实现
Serializable的父类,JVM会调用它的默认无参构造函数初始化父类实例。Entity的默认无参构造函数会把id字段初始化为null,这就导致反序列化后的User对象id为空。 - 子类
User的字段因为实现了Serializable,会从序列化流中恢复,所以name和email能保留正确值。
解决方法
方法一:让父类实现Serializable接口
修改Entity类,使其实现Serializable,这样父类的id字段会被正常序列化和反序列化:
public class Entity<ID> implements Serializable { private ID id; public ID getId() { return id; } public void setId(ID id) { this.id = id; } }
方法二:子类手动处理父类字段的序列化
如果不想修改父类,可以在User类中添加自定义的序列化/反序列化方法,手动处理父类的id字段:
public class User extends Entity<Long> implements Serializable { private String name; private String email; private List<String> friends; public User(Long ID, String name, String email) { this.setId(ID); this.name = name; this.email = email; this.friends = new ArrayList<>(); } private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); // 手动写入父类的id字段 out.writeObject(getId()); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); // 手动读取并设置父类的id字段 setId((Long) in.readObject()); } }
内容的提问来源于stack exchange,提问作者Flaviu
相关产品推荐
相关产品推荐

