我正在尝试将行集的内容打印到文件中,但我收到了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)
我无法弄清楚这里有什么问题?
答案 0 :(得分:1)
Java ObjectOuputStream
只能序列化实现java.io.Serializable
接口的对象。 JdbcRowSet
类没有实现此接口。
要打印内容,请尝试使用getRow()
,toString()
或类似内容来实现目标。
答案 1 :(得分:0)
根据doc,
已断开连接的RowSet对象具有已连接的所有功能 RowSet对象加上它们具有可用的附加功能 仅限于断开连接的RowSet对象。例如,不必 维护与数据源的连接使得RowSet断开连接 对象远比JdbcRowSet对象或ResultSet轻 宾语。断开连接的RowSet对象也是可序列化的 可串行化和轻量化的组合使它们成为可能 非常适合通过网络发送数据。
我建议使用CachedRowSet
,根据doc,它可能更适合序列化
您还可以考虑创建一个Customer类,该类使用Serializable
等字段来实现cid,cname,cemail,cphone,camount
,以表示从数据库中读取的值。然后使用每个字段的setter将Resultset中的值映射到列的值,然后将Customer
类序列化为输出文件。
注意:如果要序列化Object,则该类必须实现Serializable,强烈建议您还添加serialVersionUID来表示版本号