java.io.NotSerializableException:用于行集

java.io.NotSerializableException:用于行集,java,jdbc,rowset,Java,Jdbc,Rowset,我试图将行集合的内容打印到文件中,但得到java.io.NotSerializableException: 这是我的节目 package k564; import java.io.*; import javax.sql.RowSet; import com.sun.rowset.JdbcRowSetImpl; public class Lab15a { public static void main(String[] args) { try{ Class.forName("

我试图将行集合的内容打印到文件中,但得到java.io.NotSerializableException:

这是我的节目

package k564;

import java.io.*;
import javax.sql.RowSet;
import com.sun.rowset.JdbcRowSetImpl;

public class Lab15a {
public static void main(String[] args) {

    try{
    Class.forName("com.mysql.jdbc.Driver");
    RowSet rs= new JdbcRowSetImpl();
    rs.setUrl("jdbc:mysql://localhost:3306/jdbc");
    rs.setUsername("root");
    rs.setPassword("123");
    rs.setCommand("select cid,cname,cemail,cphone,camount from customer");
    rs.execute();

    while(rs.next()){
                System.out.println(rs.getInt("cid")+"\t"+rs.getString("cname")+"\t"+rs.getString("cemail")+"\t"+rs.getInt("cphone")+rs.getInt("camount"));          
    }

    rs.beforeFirst();
    System.out.println("Serialixzing Rowset");
    FileOutputStream fos = new FileOutputStream("d:\\rowset.txt");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(rs);
    System.out.println("serialized");
    }catch(Exception e){
        e.printStackTrace();
    }       
}
}

我得到的错误

错误:

java.io.NotSerializableException: java.lang.Object
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.HashMap.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at k564.Lab15a.main(Lab15a.java:33)

我不知道这里出了什么问题?

Java的
ObjectOutStream
只能序列化实现
Java.io.Serializable
接口的对象<代码>JdbcRowSet类未实现此接口

要打印内容,请尝试使用
getRow()
toString()
或类似工具来实现您的目标。

根据

断开连接的行集对象具有连接的所有功能 行集对象加上它们具有可用的附加功能 仅适用于断开连接的行集对象。例如,不必 保持与数据源的连接使行集断开 对象比JdbcRowSet对象或ResultSet轻得多 对象断开连接的行集对象也可以序列化,并且 可串行化和轻量级的结合使它们 非常适合通过网络发送数据

我建议使用
CachedRowSet
,根据doc,它可能更适合序列化

您还可以考虑创建一个Customer类,该类实现了
Serializable
,其中包含
cid、cname、cemail、cphone、camount等字段,以表示从数据库读取的值。然后使用每个字段的setter将Resultset中的值映射到列的值,然后可以将
Customer
类序列化到输出文件


注意:如果要序列化对象,类必须实现Serializable,强烈建议您也添加serialVersionUID来表示版本号

打印堆栈跟踪时,它会说什么?即使对象是可序列化的,如果这是您想要的,那么它将是不可读的。@Timcasteligns我已经打印了我得到的错误。@StephaneM我想将它存储在一个文件中。但是
JdbcRowSetImpl
extrends
BaseRowSet
实现了
可序列化的
@Csuki我正在尝试将它存储在一个文件中。哦我没有提到这一点。@zencv,知道我在哪里犯了错误吗。@user2900314您可能必须使用我在回答中提到的差异实现。我还没有测试代码,抱歉,这些都超出了我的想象。我一定会尝试使用CachedRowSet实现同样的功能。行集对象是无连接的对象,而且由于它实现了可序列化的imterface,为什么会出现这个错误?