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
相关产品推荐
相关产品推荐

