错误:java.io.NotSerializableException: com.mysql.cj.jdbc.result.ResultSetImpl

查了一下午的错误,大致就是RMI 客户端调用服务端API后获取数据库类ResultSet不是序列化的

java.io.WriteAbortedException: writing aborted;

java.io.NotSerializableException: com.mysql.cj.jdbc.result.ResultSetImpl

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.mysql.cj.jdbc.result.ResultSetImpl
	at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:198)
	at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:215)
	at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:160)
	at jdk.proxy1/jdk.proxy1.$Proxy0.select(Unknown Source)
	at RMI_API.RMIClient.main(RMIClient.java:16)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.mysql.cj.jdbc.result.ResultSetImpl
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1749)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:514)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:472)
	at java.rmi/sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:328)
	at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:178)
	... 4 more
Caused by: java.io.NotSerializableException: com.mysql.cj.jdbc.result.ResultSetImpl
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1197)
	at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
	at java.rmi/sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:294)
	at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:370)
	at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
	at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
	at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:833)

解决方法:ResultSet转换为List或Map,也就是可序列化的类。

(代码来源自ResultSet 转为 List或者JavaBean - 耿某 - 博客园 (cnblogs.com)

public static List<Map<String, Object>> toMap(ResultSet rs) throws SQLException {
        if(rs == null) return null;
        
        List<Map<String, Object>> result = new ArrayList<Map<String,Object>>();
        
        //获取结果集结构信息,字段类型、数量
        ResultSetMetaData rsmd = rs.getMetaData();
        int cols = rsmd.getColumnCount();
        
        Map<String, Object> map = new HashMap<String, Object>();
        while(rs.next()) {
            map = new HashMap<String, Object>();
            //将一条数据库表记录转为map存储
            for (int i = 1; i <= cols; i++) {
                map.put(rsmd.getColumnName(i), rs.getObject(i));
            }
            result.add(map);
        }
        return result;
    }

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值