用对象流将JTable写入文件时出现异常
java.io.NotSerializableException: javax.swing.JTable$CellEditorRemover又试着将DefaultTableModel写入文件还是出现这个异常
java.io.NotSerializableException: javax.swing.JTable$CellEditorRemover又试着将DefaultTableModel的getDataVector()写入文件,这时没有异常,但文件却是空的。当我增加列时,行数超过4,或者table内容改变时就会出现上面的情况,如果不改变table则可以写入文件,也可以读出。
异常:
java.io.NotSerializableException: javax.swing.JTable$CellEditorRemover
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:416)
        at javax.swing.JTable.writeObject(JTable.java:5778)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at javax.swing.event.EventListenerList.writeObject(EventListenerList.java:240)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
        ………………        

解决方案 »

  1.   

    是不是没有实现implements java.io.Serializable
    或者你更改了JTable对象,导致从文件读对象的时候不能反射出原来的对象
    使这个原因可以增加private static final long serialVersionUID
    这样可以保证不报异常 ,但是当你更改了源对象的再从文件中读你写入的那个对象的时候,反射出来的是一个空对象
    不知道是不是这个原因,就是使用ObjectOutputStream其实是从文件中的内容反射出一个新对象,完成对象的深克隆
      

  2.   

    通过ObjectOutputStream将一个Student对象写入文件后,通过记事本打开显示
     sr 
    test1.Student  )Y悧? I ageL namet Ljava/lang/String;xp   t viszl
    然后在调用ObjectInputStream可以通过这些数据反射出来一个新对象,所以当你原来的类文件更改了,就不能正确的反射了
      

  3.   

    JTable使用的是自己定义的TableModel和TableCellRenderer,都实现了Serializable。
    问题出现在TableCellEditor上,如果不点击table对它进行更改,就可以存入。如果点击更改了,就不行。
    我看JTable的源码了,有个内部类CellEditorRemover,它没有实现Serializable。就是它出现异常了,不知道给它实现Serializable会不会有用。
      

  4.   

    从你的那个异常来看,应该是没有实现Serializable接口。
    但是jdk5的javadoc显示java.awt.Component已经实现了Serializable接口。
    所以,真的很奇怪。
      

  5.   

    你可以试试。
    但是,我觉得既然sun没有让这个类实现Serializable接口,肯定是有他的道理的……
      

  6.   

    请问一下,要给CellEditorRemover实现Serializable,应该怎么操作,谢谢。