Hallo!
ich wollte heute meinem Serialisierungmechanismus (Nciht die Java Serialisierung!) die Fähigkeiten bescheren, "Circular References" zu beherrschen.
Erst dachte ich :
"hm, ansich sollte das ja total einfach sein! Einfach alle Objekte mit einer HashMap vergleichen beim schreiben und wenn es das Objekt bereits gibt, einfach den Index schreiben, wo diese Objekt zu finden ist" - Aber beim deserialisieren kam ich dann in einen logischen Konflikt =(.
Kurz zum hintergrund: Einige kennen vlt. "Kryo" (Kann leider auch nicht Circular-References ab..)... So ähnlcih ist auch mein Serialisierungskonzept. Hier und da etwas anders, aber im Prinzip ähnlich.
Nun mein logisches Problem wäre z.B. sowas hier:
Der 2te String wird einfahc nur als Index geschrieben, denn der erste String ist ja identisch. Als dritten Wert bekommt das Objektarray eine REferenz auf sich selbst... hier endet Kryo natürlich in einem StackOverflow... Java Serialisierung nicht und mich würde gerne interesieren, wie die das macht.
Ich meine klar, beim serialisieren ist das kein Problem:
(Auszug aus meinem System)
Nun beim Deserialisieren gibt es aber bei mir folgendes Problem:
(BTW: Es wird rekursiv serialisiert und deserialisiert!)
Hier mal etwas pseudo code:
LESE CodecId
FALLS CodecId = CIRCULAR_REFERENCE...
GIB_ZURÜCK object_aus_cache
ANSONSTEN
*OBJECT* = DESERIALISIERE NORMAL!
SPEICHERE *OBJECT* NUN IM CACHE
GIB_ZURÜCK *OBJECT*
Zurück beim Arraybeispiel hab nun das Problem, dass quasi mein Codec aufgerufen wird, der Arrays speichert - Dieser ruft dann für alle Inhalte den jeweiligen Codec auf und-so-weiter.
Beim dritten Objekt gäbe es nun eine Zwickmühle:
Das Problem weiß zwar "Hey, das folgende Objekt, bist du selbst!" - Also der dritte Paramter ist ja das Array selber... Aber wie aus dem Pseudocode zu erkennen ist, kann ja beim deserialsieren, die Objekte erst in den Cache packen, sobald sie "DESERIALISIERT" sind... Sprich das Object[]-Array ist erst deserialisiert, wenn alle komponenten auch serialisiert sind...
Ich hoffe, ich kann mein Problem einigermaßen verständlich machen....
Leider hab ich grad ein Brett vorm Kopf und mir fällt einfach nicht ein, wie ich den Algorithmus anpassen kann.
Danke schonmal =)
Gruß,
Chris
ich wollte heute meinem Serialisierungmechanismus (Nciht die Java Serialisierung!) die Fähigkeiten bescheren, "Circular References" zu beherrschen.
Erst dachte ich :
"hm, ansich sollte das ja total einfach sein! Einfach alle Objekte mit einer HashMap vergleichen beim schreiben und wenn es das Objekt bereits gibt, einfach den Index schreiben, wo diese Objekt zu finden ist" - Aber beim deserialisieren kam ich dann in einen logischen Konflikt =(.
Kurz zum hintergrund: Einige kennen vlt. "Kryo" (Kann leider auch nicht Circular-References ab..)... So ähnlcih ist auch mein Serialisierungskonzept. Hier und da etwas anders, aber im Prinzip ähnlich.
Nun mein logisches Problem wäre z.B. sowas hier:
Java:
Object[] o = new Object[]{"0123456789", "0123456789", null};
o[2] = o;
Der 2te String wird einfahc nur als Index geschrieben, denn der erste String ist ja identisch. Als dritten Wert bekommt das Objektarray eine REferenz auf sich selbst... hier endet Kryo natürlich in einem StackOverflow... Java Serialisierung nicht und mich würde gerne interesieren, wie die das macht.
Ich meine klar, beim serialisieren ist das kein Problem:
(Auszug aus meinem System)
Java:
//Put the index
Integer oldIndex = cache.get(message);
if (oldIndex != null) {
//Put invalid codec id
raw().put((byte) CodecRegistry.INVALID_CODEC_ID);
//Write the old index
raw().putInt(oldIndex); //HIER schreibe ich einfach den Index des alten Codecs.
} else {
//Put in cache
cache.put(message, objectCounter); //HIER füge ich das unique object in die map ein, da es das erste ist seiner art...
//Write object
writeObject(message, writeCodec(message)); //DAS ist nicht Java Serialisierung, sondern mein System...
}
//Just increase the object counter...
objectCounter++;
Nun beim Deserialisieren gibt es aber bei mir folgendes Problem:
(BTW: Es wird rekursiv serialisiert und deserialisiert!)
Hier mal etwas pseudo code:
LESE CodecId
FALLS CodecId = CIRCULAR_REFERENCE...
GIB_ZURÜCK object_aus_cache
ANSONSTEN
*OBJECT* = DESERIALISIERE NORMAL!
SPEICHERE *OBJECT* NUN IM CACHE
GIB_ZURÜCK *OBJECT*
Zurück beim Arraybeispiel hab nun das Problem, dass quasi mein Codec aufgerufen wird, der Arrays speichert - Dieser ruft dann für alle Inhalte den jeweiligen Codec auf und-so-weiter.
Beim dritten Objekt gäbe es nun eine Zwickmühle:
Das Problem weiß zwar "Hey, das folgende Objekt, bist du selbst!" - Also der dritte Paramter ist ja das Array selber... Aber wie aus dem Pseudocode zu erkennen ist, kann ja beim deserialsieren, die Objekte erst in den Cache packen, sobald sie "DESERIALISIERT" sind... Sprich das Object[]-Array ist erst deserialisiert, wenn alle komponenten auch serialisiert sind...
Ich hoffe, ich kann mein Problem einigermaßen verständlich machen....
Leider hab ich grad ein Brett vorm Kopf und mir fällt einfach nicht ein, wie ich den Algorithmus anpassen kann.
Danke schonmal =)
Gruß,
Chris