You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:10:26