2012-04-03 5 views
1

Ist es möglich, ein Objekt aus einer Datei zu deserialisieren und dann nur wenige davon in die gleiche Datei zu serialisieren? Natürlich müssen die Nummern von Objekt davor und danach gleich sein. Ich möchte keine neuen Objekte in die Datei einfügen, sondern geänderte Objekte überschreiben. Zum Beispiel gibt es etwa 1000 Objekte, die ich aus der Datei 'file.ser' bekomme. Ich deserialisiere sie, ändere nur 3 und möchte diese in dieselbe Datei überschreiben. Ist es möglich?Java/Serializable - Nur geänderte Objekte überschreiben

Antwort

1

Die kurze Antwort ist nein, Sie können nicht einfach die geänderten Objekte "in-place" innerhalb der Datei überschreiben.

Wenn Sie eine ObjectOutputStream erstellen, schreibt der Stream selbst bevor Sie ein Objekt in ihn schreiben, einige magic number marker bytes in den zugrunde liegenden Stream. Diese Bytes werden automatisch von einem ObjectInputStream verbraucht, wenn Sie einen erstellen. Dies ist der Stream-Header.

Außerdem, wenn Sie ein Objekt mit ObjectOutputStream.writeObject() schreiben, sind Sie nicht einfach serialisaing dass Objekt Isolation ist. Der Stream verfolgt die Objektreferenzen, die er zuvor serialisiert hat (es sei denn, Sie rufen reset()), und anstatt das Objekt vollständig zu schreiben, wird ein Handle geschrieben, das auf das reelle Objekt verweist.

Schließlich gibt es keine Blockausrichtung oder Auffüllung zwischen den Objekten, die in den Stream geschrieben wurden - sie werden zusammenhängend geschrieben.

All dies bedeutet, dass wenn Sie ein Objekt ändern, die strukturellen Änderungen, die Sie vorgenommen haben (Verweise auf andere Objekte usw.) bedeuten, dass die Griffe anders sein könnten und die Länge des Objekts könnte unterschiedlich sein. Da keine Blockausrichtung stattfindet, können Sie das Objekt nicht an die gleiche Stelle zurückschreiben, da die vorgenommenen Änderungen (wahrscheinlich) die Länge beeinflussen und nicht identisch sind, was bedeutet, dass Sie über das Objekt stapfen werden oben auf einem anderen Objekt.

+0

Ich bin so dankbar für eine umfassende Erklärung. Alles ist jetzt klar. – ast

1

Nein, Sie müssen die Datei neu erstellen. Der Objektstrom ist tatsächlich ein Stream, nicht nur eine Menge von Datensätzen.

0

Wenn Sie über Geschwindigkeit besorgt sind, habe ich Java immer ziemlich schnell gefunden. Es könnte nicht zu viel Strafe beim Lesen der ganzen Sache sein - versuchen Sie etwas Profiling.

Sie könnten versuchen, Java Serialisierung durch eine Alternative wie Google Protocol Buffers zu ersetzen.

ProtoBuf ist sehr schnell und sehr platzsparend.

Verwandte Themen