2014-04-24 6 views
0

내가 파일에 설정 행의 내용을 인쇄하려고하지만 java.io.NotSerializableException 얻고 경우 : 여기 java.io.NotSerializableException :의 RowSet

내 프로그램을 ..

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

당신은 스택 추적을 인쇄 버전 번호를 대표하는의 serialVersionUID를 추가하는 것이 좋습니다, 그것은 무엇을 말하는가? –

+0

개체가 직렬화 가능했다하더라도 원하는 경우 사람이 읽을 수 없습니다. – StephaneM

+0

@TimCastelijns 내가받는 오류를 인쇄했습니다. – User27854

답변

1

Java의 ObjectOuputStreamjava.io.Serializable 인터페이스를 구현하는 객체 만 직렬화 할 수 있습니다. JdbcRowSet 클래스는이 인터페이스를 구현하지 않습니다.

내용을 인쇄하려면 목표를 달성하기 위해 getRow(), toString() 또는 비슷한 것을 사용해보십시오. doc에 따르면

+1

하지만'JdbcRowSetImpl'은'Serializable'을 구현하는'BaseRowSet'를 extrend합니다. – zencv

+0

@Csuki 파일에 저장하려고합니다. 오! 나는 그것을 언급하지 않았다. – User27854

+0

@ zencv, Anyidea 어디에서 실수하고 있니? – User27854

0

,

Disconnected RowSet objects have all the capabilities of connected RowSet objects plus they have the additional capabilities available only to disconnected RowSet objects. For example, not having to maintain a connection to a data source makes disconnected RowSet objects far more lightweight than a JdbcRowSet object or a ResultSet object. Disconnected RowSet objects are also serializable, and the combination of being both serializable and lightweight makes them ideal for sending data over a network.

내가 의사에 따른

또한 cid,cname,cemail,cphone,camount 같은 필드 Serializable를 구현하는 고객 클래스를 생성 생각할 수

를 직렬화에 더 적합 할 수있다 이는 CachedRowSet를 사용하는 것이 좋습니다 데이터베이스에서 읽은 값을 나타냅니다. 그런 다음 각 필드에 대해 setter를 사용하여 Resultset의 값을 열 값에 매핑 한 다음 Customer 클래스를 출력 파일에 직렬화 할 수 있습니다.

참고 : Object를 직렬화하려면, 클래스가 Serializable를 구현해야하며 강하게 또한

+0

미안 해요,이게 내 머리 위의 길입니다. CachedRowSet을 사용하여 동일한 구현을 확실히 시도 할 것입니다. RowSet 객체는 비 연결 객체입니다. 직렬화 가능 imterface 구현 이래로 왜이 오류가 발생합니까? – User27854