0

行セットの内容をファイルに出力しようとしていますが、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)

ここで何が間違っているのかわかりませんか?

4

2 に答える 2

1

Javaは、インターフェースObjectOuputStreamを実装するオブジェクトのみをシリアライズできjava.io.Serializableます。JdbcRowSetクラスはこのインターフェースを実装していません。

内容を印刷するにはgetRow()、 、toString()または同様のものを使用して、目的を達成してください。

于 2014-04-24T11:40:21.123 に答える
0

ドキュメントによると、

切断された RowSet オブジェクトは、接続された RowSet オブジェクトのすべての機能に加えて、切断された RowSet オブジェクトでのみ使用できる追加の機能を備えています。たとえば、データ ソースへの接続を維持する必要がないため、切断された RowSet オブジェクトは JdbcRowSet オブジェクトや ResultSet オブジェクトよりもはるかに軽量になります。切断された RowSet オブジェクトもシリアライズ可能であり、シリアライズ可能であると同時に軽量であるため、ネットワーク経由でデータを送信するのに理想的です。

CachedRowSetドキュメントによると、シリアル化により適している可能性がある を使用することをお勧めします

データベースから読み取った値を表すSerializableようなフィールドを実装する Customer クラスを作成することも考えられます。cid,cname,cemail,cphone,camount次に、各フィールドのセッターを使用して、結果セットの値を列の値にマップすると、Customerクラスを出力ファイルにシリアル化できます。

注: オブジェクトをシリアル化する場合、クラスは Serializable を実装する必要があり、バージョン番号を表すために serialVersionUID も追加することを強くお勧めします

于 2014-04-24T11:43:48.247 に答える