# Problem mit ObjectOutputStream / JTable



## EagleEye (1. Jul 2004)

ich hab ne jtable wo ich daten drin hab
und wenn ich mein prog beende dann wird das tablemodel(defaulttablemodel) plus andere sachen mit einem objectoutputstream abgespeichert in eine datei gespeichert
ich kann neue zeilen hinzufügen zeileninhalte ändern und auch zeilen löschen das geht alles ohne fehler nur wenn ich dann das prog beende dann kommt jedes mal wenn ich zeilen gelöscht habe diese fehlermeldung


```
java.io.NotSerializableException: javax.swing.JTable$CellEditorRemover


java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
java.io.ObjectOutputStream.defaultWriteObject(Unknown Source)
javax.swing.JTable.writeObject(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
java.io.ObjectOutputStream.writeSerialData(Unknown Source)
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.writeObject(Unknown Source)
javax.swing.event.EventListenerList.writeObject(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
java.io.ObjectOutputStream.writeSerialData(Unknown Source)
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
java.io.ObjectOutputStream.writeSerialData(Unknown Source)
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.writeObject(Unknown Source)
java.util.Hashtable.writeObject(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
java.io.ObjectOutputStream.writeSerialData(Unknown Source)
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.writeArray(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
java.io.ObjectOutputStream.defaultWriteObject(Unknown Source)
java.util.Vector.writeObject(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
java.io.ObjectOutputStream.writeSerialData(Unknown Source)
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.writeArray(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
java.io.ObjectOutputStream.defaultWriteObject(Unknown Source)
java.util.Vector.writeObject(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
java.io.ObjectOutputStream.writeSerialData(Unknown Source)
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.writeArray(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
java.io.ObjectOutputStream.defaultWriteObject(Unknown Source)
java.util.Vector.writeObject(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
java.io.ObjectOutputStream.writeSerialData(Unknown Source)
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.writeObject(Unknown Source)
java.util.Hashtable.writeObject(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
java.io.ObjectOutputStream.writeSerialData(Unknown Source)
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.writeObject(Unknown Source)
java.util.Hashtable.writeObject(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
java.io.ObjectOutputStream.writeSerialData(Unknown Source)
java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
java.io.ObjectOutputStream.writeObject0(Unknown Source)
java.io.ObjectOutputStream.writeObject(Unknown Source)
EagleManagerBeenden.<init>(EagleManagerBeenden.java:16)
EagleManager.beenden(EagleManager.java:87)
EagleManager$1.windowClosing(EagleManager.java:110)
java.awt.Window.processWindowEvent(Unknown Source)
javax.swing.JFrame.processWindowEvent(Unknown Source)
java.awt.Window.processEvent(Unknown Source)
java.awt.Component.dispatchEventImpl(Unknown Source)
java.awt.Container.dispatchEventImpl(Unknown Source)
java.awt.Window.dispatchEventImpl(Unknown Source)
java.awt.Component.dispatchEvent(Unknown Source)
java.awt.EventQueue.dispatchEvent(Unknown Source)
java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
java.awt.EventDispatchThread.pumpEvents(Unknown Source)
java.awt.EventDispatchThread.pumpEvents(Unknown Source)
java.awt.EventDispatchThread.run(Unknown Source)
```
das schreiben selbst ist einfach nur das

```
/*
**
** Beenden und speichern der daten
**
*/
import java.util.*;
import java.io.*;

class EagleManagerBeenden{
  
  public EagleManagerBeenden(EagleManager quelle,Hashtable hash)
  {
    try
    {
      ObjectOutputStream write = new ObjectOutputStream(new FileOutputStream("EagleManager.set"));
      write.writeObject(hash);
    }
    catch(IOException ex)
    {
      new JErrorDialog(quelle,"Fehler beim beenden Programms",ex);
    }
    System.exit(0);
  }
}
```


----------



## Mick (1. Jul 2004)

Der sagt doch schon, wo das Problem liegt:

java.io.NotSerializableException: javax.swing.JTable$CellEditorRemover 


Dein CellEditorRemover ist nicht serializable, da fehlt ein implements Serializable.

Grüße,
Mick


----------



## EagleEye (1. Jul 2004)

sorry aba das verstehe ich nciht ganz weil ich habe keinen CellEditorRemover ich habe nur das normale defaulttablemodel was ich mit daten füttere und das geht auch alles zu speichern nur halt wenn ich ne zeile lösche mag er nichtmehr speichern


----------



## Mick (1. Jul 2004)

Sorry, hab mich wohl etwas unklar ausgedrückt. Ich meinte nicht DEIN, sondern DER und zwar der
vom JTable. Da kannst Du direkt wohl nichts dran machen. Das Problem ansich ist mir so nicht bekannt,
aber damit kannst Du ja mal weiterforschen.


----------



## Beni (1. Jul 2004)

Der Name _javax.swing.JTable$CellEditorRemover_ gibt aber an, dass der CellEditorRemover Teil vom JTable ist. 
Er wird über irgendwelche Ecken und Kanten gespeichert. (Wahrscheinlich wird erst eine Instanz erstellt, wenn eine Row entfernt wird...).

Du kannst entweder die Methoden _private void writeObject(java.ibjectOutputStream out)_ und _private void readObject(java.ibjectInputStream in)_ überschreiben, oder halt einfach den Inhalt des Models "per Hand" zu speichern. Das sollte ist normalerweise keinen riesigen Aufwand.


----------



## EagleEye (1. Jul 2004)

hmm mist hab gerade gemerkt wenn ich auf eine andere "seite" von meinem proggehe so das die tabelle nicht mehr aktiv ist dann kann ich speichern sonst nicht
muß ich mal sehn wie ich das hinbekomme

thx für die hilfe


----------

