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
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.
Nein, Sie müssen die Datei neu erstellen. Der Objektstrom ist tatsächlich ein Stream, nicht nur eine Menge von Datensätzen.
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.
- 1. Aktualisierungstabelle für nur geänderte Felder
- 2. Winkelform - senden nur geänderte Felder
- 3. Auslöser für nur geänderte Werte
- 4. Get ANT scp nur neue/geänderte Dateien
- 5. zuletzt geänderte Dateien wurden nur verschoben?
- 6. reagieren Unveränderlichkeit Helfer nur geänderte Datenteilmenge
- 7. Nur geänderte Felder im Backbone-Modell senden
- 8. Maven: Installieren Sie nur die geänderte Datei
- 9. Wie git Rebase nur geänderte Dateien
- 10. git nur einige geänderte Dateien hinzufügen
- 11. Ember.js: @each Beobachten, aber Iterieren nur über neue/geänderte Produkte
- 12. Wie überschreiben verschachtelte C++ - Objekte Methoden?
- 13. Ziel C überschreiben% @ für benutzerdefinierte Objekte
- 14. immutablejs mergeWith Objekte überschreiben aber neue Listen
- 15. openrefine flag geänderte Zeilen
- 16. Winkel senden nur geänderte Felder zu aktualisieren Methode
- 17. Deployment-Konfiguration - Führen Sie nur neue und geänderte Stored Procedures
- 18. Grunt: Wie Task nur für geänderte Datei ausführen?
- 19. Wie wird der geänderte Dateiname nur mit git log angezeigt?
- 20. Grunt Watch Event mit Grunt Copy für nur geänderte Dateien
- 21. ist es möglich, nur geänderte Dateien zu "git status"?
- 22. Powershell Copy-Item, sondern kopieren Sie nur geänderte Dateien
- 23. MobX - Beobachtbares Objekt, das nur geänderte Felder erfasst?
- 24. Get Gulp beobachten Funktion nur auf geänderte Datei auszuführen
- 25. Nur geänderte Werte ohne verschachtelte if-Anweisungen drucken
- 26. Prototyp nur für {...} Objekte definieren
- 27. Schienen: Überprüfen geänderte Felder
- 28. Verwirrt durch geänderte API
- 29. Vim - geänderte Zeilen markieren
- 30. Gibt es eine Methode, um geänderte Attribute für Objekte zu finden?
Ich bin so dankbar für eine umfassende Erklärung. Alles ist jetzt klar. – ast