【问题标题】:java.io.NotSerializableException: For RowSetjava.io.NotSerializableException:对于 RowSet
【发布时间】:2014-06-09 15:51:36
【问题描述】:

我正在尝试打印出设置为文件的行的内容,但我得到 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)

我无法弄清楚这里出了什么问题?

【问题讨论】:

  • 你打印堆栈跟踪,它说什么?
  • 即使你的对象是可序列化的,如果这是你想要的,它也不会是人类可读的。
  • @TimCastelijns 我已经打印了我遇到的错误。
  • @StephaneM 我想将它存储在一个文件中。

标签: java jdbc rowset


【解决方案1】:

Java 的ObjectOuputStream 只能序列化实现java.io.Serializable 接口的对象。 JdbcRowSet 类没有实现这个接口。

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

【讨论】:

  • 但是JdbcRowSetImpl 扩展了BaseRowSet,实现了Serializable
  • @Csuki 我正在尝试将其存储在文件中。哦!我没有提到。
  • @zencv,知道我在哪里犯了错误。
  • @user2900314 可能您必须使用差异。正如我在回答中提到的那样实施。我还没有测试过代码
【解决方案2】:

根据doc,

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

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

您还可以考虑创建一个 Customer 类,该类实现 Serializable 并使用 cid,cname,cemail,cphone,camount 之类的字段来表示从数据库中读取的值。然后使用每个字段的设置器将结果集的值映射到列的值,然后您可以将Customer 类序列化到输出文件。

注意:如果你想序列化一个Object,该类必须实现Serializable,强烈建议你也添加一个serialVersionUID来表示版本号

【讨论】:

  • 对不起,这些都超出了我的想象。我肯定会尝试使用 CachedRowSet 来实现相同的功能。 RowSet 对象是无连接对象,而且由于它实现了可序列化的接口,为什么我会收到此错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2013-07-11
  • 2013-01-03
  • 2013-09-13
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多