Frage zum ObjectOutputStream

fireblade1282

Mitglied
Kurze Frage...
ich habe eine Klasse "Document", welche die Serializable Schnittstelle implementiert...
Instanzen dieser Klasse kann ich nun doch theoretisch per ObjectOutputStream in eine Datei reinspielen und später wieder rausladen... allerdings besitzt meine Klasse einen private Vector in dem "Paragraph" Objekte liegen.. also mein Laufzeitmodell eines Dokuments besteht aus einem serializable Dokument, das wiederum aus einem Vector of (auch serializable) Paragraphs besteht. Zur Laufzeit hängen also die Paragraphen da dran... wenn ich das Teil jetzt durch den ObjectOutputStream spüle.... und nachher wieder aus einer Datei oder Socket oder was weiss ich woher lese,... werden dann wieder alle Paragraphen dran sein? oder muss ich die einzeln "retten"?
Also mein Problem ist ähnlich dem, dass sich als "copy" und "deepcopy" beim Object-Clonen stellt, wenn ihr wisst was ich meine...
Wäre nett, wenn mir das jemand kurz erklärt... danke...
- Andy
 
Hallo!

Der Serialisierungsmechanismus von Java geht grundsätzlich allen nicht als transient markierten Assoziationen nach. Insofern wird dein Vector mit deinen Paragraphen auch mit Serialisiert wenn dein Document serialisiert wird.

Gruß Tom
 
Danke Tom für die schnelle Antwort....
Kannst du mir evtl noch einen Satz zu dem "transient" posten? was bedeutet das...?
Ich nenn' es jetzt mal "DeepCopy" Mechanismus... weil irgendwie ist es ja sowas...
jedenfalls dieses DeepCopy kommt wenn ich dich richtig verstanden habe immer im Normalfall zum Einsatz und ich denke mal Java ist schlau genug zyklische Verkettungen in diesen Objekten sauber umzusetzen und hängt sich nicht auf.... *g*
und wenn jetzt also eine als "transiente" eingestufte Assoziation kommt... (häh?! :) ) hört das auf... wie markiere ich so eine "End-Of-Serialization" was heisst das für mich?

und evtl noch ein kurzer Tip, falls gerade greifbar...:
Wenn ich einen ObjectInput auf einen leeren Stream (zB neue, leere Datei) ansetze hatte ich gehofft den resultierenden Fehler abfangen zu können, indem ich ein .. tja.. "null object" standardmässig in eine neue Datei lege... allerdings ist null ja wahrscheinlich so etwas generisches wie int.... wenn dann bräuchte ich denke ich mal so was wie einen Integer(int) Wrapper also in meinem Fall einen Null(null) Wrapper... gibts so was? :) :) oder soll ich die Fehlermeldung gezielt abfangen und das Object auf null setzen? Dann weiss die Senke aber nicht - bei einem Sockel - ob die Übertragung schuld war oder die Quelle leer?

Freu mich über kurze Antwort!
 
Hallo

Mit transient kann man variablen kennzeichnen die nicht mitgeschrieben werden solln
Code:
private String name;
private Date date;
private transient boolean saved;
In diesem Fall wird die variable "saved" nicht mit in die Datei geschrieben.
Wäre ja etwas unlogisch, eine variable die zeigt ob gesaved ist oder nicht, mit zu saven!

Schöne Grüße Markus
 
oh.. wow... danke, das war eindeutig und hilfreich
man lernt nie aus... ich hätte wirklich mal ein richtiges kompendium statt nur die gängigen modifier lesen sollen :) :) aber ein unSerialisiertes Object hat diese Variable dann wieder? nur uninitialized oder wie ist das zu verstehen?

btw. wegen meinem null Problem oben - ob ich "null" wrappen oder serialisieren kann... kann es sein, dass ich mir eine "null symbolisierende klasse" schreiben sollte und mit instanceof checke ob ich dieses ding aus dem stream gelesen habe und dann auf null setze? Ich glaube, das ist im moment das logischste....

Vielen Dank für die beiden Antworten, hier wird man wirklich geholfen :)
-Andy
 
fireblade1282 hat gesagt.:
aber ein unSerialisiertes Object hat diese Variable dann wieder? nur uninitialized oder wie ist das zu verstehen?
Ja
nach dem Lesen wäre:
String auf null
int auf 0
boolean auf false
fireblade1282 hat gesagt.:
Wenn ich einen ObjectInput auf einen leeren Stream (zB neue, leere Datei) ansetze hatte ich gehofft den resultierenden Fehler abfangen zu können
Bin mir nicht ganz sicher ob ich geschnallt habe was du meinst.
jedenfalls wirft folgender Code eine EOFException(EndOfFileException)
Code:
while(liste.add(objectinputstream.readObject()))
{
}
Ist vermutlich nicht die sauberste Variante,
aber so wird gelesen so lange Objecte drinnen sind,
bzw wenn die Datei leer ist wird sie sofort geworfen.
 
Danke! Das wär dann wohl die beste Methode... ein eigenes Mini-Object reinlegen, was das Ende markiert,.. und falls was schiefgeht halt die Exception abfangen....
 
Zurück