用对象流将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)
………………
或者你更改了JTable对象,导致从文件读对象的时候不能反射出原来的对象
使这个原因可以增加private static final long serialVersionUID
这样可以保证不报异常 ,但是当你更改了源对象的再从文件中读你写入的那个对象的时候,反射出来的是一个空对象
不知道是不是这个原因,就是使用ObjectOutputStream其实是从文件中的内容反射出一个新对象,完成对象的深克隆
sr
test1.Student )Y悧? I ageL namet Ljava/lang/String;xp t viszl
然后在调用ObjectInputStream可以通过这些数据反射出来一个新对象,所以当你原来的类文件更改了,就不能正确的反射了
问题出现在TableCellEditor上,如果不点击table对它进行更改,就可以存入。如果点击更改了,就不行。
我看JTable的源码了,有个内部类CellEditorRemover,它没有实现Serializable。就是它出现异常了,不知道给它实现Serializable会不会有用。
但是jdk5的javadoc显示java.awt.Component已经实现了Serializable接口。
所以,真的很奇怪。
但是,我觉得既然sun没有让这个类实现Serializable接口,肯定是有他的道理的……