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

RMI ArrayList应用报错求助:UnmarshalException与NotSerializableException问题

解决RMI传输ArrayList时的UnmarshalException错误

嘿,我从你的报错日志里一眼就揪出了问题根源!

问题出在哪?

报错里的java.io.NotSerializableException: food.order.system.foodorder已经说得很明确了:你的foodorder类没有实现Serializable接口。

在RMI的通信机制里,任何需要在客户端和服务端之间跨网络传输的对象(包括你ArrayList里的每个foodorder实例),都必须实现Serializable接口——这是JVM对对象进行序列化/反序列化的前提,不然根本没法把对象转换成可传输的字节流,自然就会抛出这个反序列化失败的异常。

怎么修复?

只需要给foodorder类加上Serializable接口实现就行,顺便加上显式的序列化版本号(这是Java序列化的最佳实践,能避免后续修改类结构时出现兼容性问题):

import java.io.Serializable;

public class foodorder implements Serializable {
    // 显式声明序列化版本号,随便设一个固定值就行
    private static final long serialVersionUID = 1L;
    
    private double price;
    private String menu_name;

    public foodorder(String menu_name, double price) {
        this.price = price;
        this.menu_name = menu_name;
    }

    // 别忘了把你之前的getter方法补上!
    // 客户端代码里要调用getMenu_name(),没有这个方法的话拿到对象也没法取属性
    public String getMenu_name() {
        return menu_name;
    }

    public double getPrice() {
        return price;
    }
}

额外提醒几个小细节

除了上面的核心修复,还有几个地方可以优化,避免后续踩坑:

  • 服务端的cart集合如果是类成员变量,多次调用cmenu()会导致数据累加,建议在cmenu()方法开头加一句cart = new ArrayList<>();,保证每次返回的都是最新查询的菜单数据。
  • 服务端里的数据库连接、Statement这些资源,用完一定要记得关闭,不然会造成资源泄漏。
  • 启动顺序别搞反:先启动RMIRegister,再启动服务端,最后运行客户端,不然客户端会找不到注册的服务。

验证一下

修改完代码后重新编译所有类,按顺序启动服务,再运行客户端,应该就能正常打印菜单列表啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:57:29