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

Java NotSerializableException异常求助:自定义DataPackage类相关问题

解决Java序列化中的NotSerializableException问题

嘿,这个坑我之前踩过!咱们先搞清楚为啥会抛这个异常:当你在客户端-服务端之间传输对象时,Java需要把对象序列化成字节流,再在另一端反序列化为对象。而只有实现了Serializable接口的类及其成员对象才能被序列化,你的DataPackage类或者它里面的成员没满足这个要求,就会触发NotSerializableException。

下面是具体的解决步骤:

1. 给DataPackage类添加Serializable标记

Serializable是一个标记接口(不需要实现任何方法),只要让你的类实现它,就相当于告诉JVM:这个类的对象可以被序列化。

修正后的类定义:

import java.io.Serializable;
import java.util.Date;

public class DataPackage implements Serializable {
    // 推荐手动指定序列化版本号,避免类结构变更导致的兼容性问题
    private static final long serialVersionUID = 123456789L;
    
    private Object object;
    private Date time;
    private long timeMs;
    private boolean responded;
    private String publicIp;
    private String internalIp;
    private int hash;

    public DataPackage(Object object) {
        this.object = object;
        this.time = new Date();
        this.timeMs = System.currentTimeMillis();
        // 其他初始化逻辑补全...
    }

    // 按需添加getter/setter方法
}

2. 检查成员变量的可序列化性

你的DataPackage里有个Object object成员,如果这个object实际引用的类没有实现Serializable,依然会抛出异常。比如如果你传入的是自定义的业务类(比如User、Order),那这些类也必须实现Serializable:

public class User implements Serializable {
    private static final long serialVersionUID = 987654321L;
    private String userId;
    private String nickName;
    // ... 其他字段和方法
}

如果有些成员变量不需要传输(比如本地临时计算的变量),可以用transient关键字修饰,序列化时会自动跳过这些变量:

// 这个hash变量如果只是本地校验用,不需要传输的话
private transient int hash;

3. 额外提醒:序列化版本号的作用

手动指定serialVersionUID可以避免后续修改类结构(比如添加/删除字段)后,反序列化时抛出InvalidClassException。只要版本号一致,即使类结构有小变化,依然可以正常反序列化。


内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:29:05