Hi,
ich habe ein Problem: ich bekomme ich eine RemoteException,
genauer eine EOFException, wenn ich versuche ein vorher
Serialisiertes Object wieder einzulesen. (vom
ObjectImputStream geworfen)
RemoteException ? du arbeites also mit RMI ?
Bist du lebensmüde ?
Folgende Fehlermeldung:
Error unmarshaling return header; nested exception is:
java.io.EOFExceptionOU@X
EOF heist: die de-serialisierung braucht noch ein paar Infos, der Stream ist aber schon am Ende.
unmarshaling heist meistes dass die Exception auf dem anderen Rechner aufgetreten ist und „rübergeworfen“ wurde.
Irgendwas muß da schief laufen. Bei dem Object handelt es sich
um einen ziemlich komplexen Graphen, daher hier mal kein
Source Code. Komischerweise funktioniert das ganze, wenn ich
einen anderen Graphen aufbaue, aber die gleichen Klassen
benutze.
„Komplexe“ Graphen verträgt die seriailiserungs-Engine nicht immer. Die Grenze liegt bei etwa 5000 Objecten mit JDK 1.3.0. Es hängt aber vom Zustand des JVM-RAM’s ab. Zum testen kanns du ja mal eine linked-list in eine Datei schreiben.
Ich habe eigentlich die Serialisierbarkeit _aller_ beteiligten
Klassen mehrmals gecheckt.
Das ist es nicht, dann kommen andere Fehlermeldungen.
Folgendes in Bezug auf serialisieren ist doch korrekt, oder?
- java kann von selber alle primitiven Variablen eines
Objektes serialisieren
Jupp.
- Java kann von selber alle member-Objecte einer Klasse
serialisieren, sofern diese Serialisierbar sind.
Jupp. (Ausnahme: transient Variablen (Pointer) werden nicht serialisiert und auf der anderen Seite durch null-pointer ersetzt.)
- um member-Arrays zu serialisieren oder selbstgeschriebe
Klassen serialiserbar zu machen, muß man die writeObject oder
readObject-Methode implementieren…
Ju… ähm… Nein… nicht ganz
Die selbst geschriebenen Klassen müssen nur das Interface „Serializable“ implementieren. Da das Interface keinen Methoden besitzt reicht „implements Serializable“.
Arrays muss man selber serialiseren. Dabei muss man unheimlich auf den Stream aufpassen. U.A. darf man nichts reinschreiben was als Begin oder Ende einer Klasse gewertet werden könnte.
Im bezug auf die Fehlermeldung:
schliesst du den Stream in einer deiner Methoden ? (wenn ja, tus nicht)
Bin über jede Idee dankbar.
So blöd das auch klingen mag: Verzichte bei RMI auf array’s.
Ich weis nicht was du da baust aber die Idee von RMI ist nicht das Übertragen von grossen Graphen auf einen Schlag sondern das dyn. zusammenlegen von JVM’s.
Bau also entweder einen Proxy über den der Client die einzelen Objecte rüberholen kann (getParent() / getChildren(), get(int Index)).
oder:
bau die Objecte alle als remote-Objecte (wesentlich weniger Aufwand beim Transfer, allerdings laufen dann alle Methodenaufrufe übers Netz. Dafür sind die Objecte auf JVM’s „gleich“)
oder:
verzichte im Graphen auf arrays und bau linked-lists (selbst geschriebene, java.util.* ist bei RMI nicht zu gebrauchen).
wenn du immernoch nicht klar kommst, beschreib die Aufgabenstellung genauer.
cu.