java.io.NotSerializableException:用于行集
我试图将行集合的内容打印到文件中,但得到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("
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
extrendsBaseRowSet
实现了可序列化的@Csuki我正在尝试将它存储在一个文件中。哦我没有提到这一点。@zencv,知道我在哪里犯了错误吗。@user2900314您可能必须使用我在回答中提到的差异实现。我还没有测试代码,抱歉,这些都超出了我的想象。我一定会尝试使用CachedRowSet实现同样的功能。行集对象是无连接的对象,而且由于它实现了可序列化的imterface,为什么会出现这个错误?