Ich habe eine ganze Reihe von Artikeln über Serialisierung gelesen und wie schön und großartig es ist, aber keines der Argumente war überzeugend genug. Ich frage mich, ob mir wirklich jemand sagen kann, was wir wirklich erreichen können, wenn wir eine Klasse serialisieren.
105
Antworten:
Definieren wir zuerst die Serialisierung, dann können wir darüber sprechen, warum sie so nützlich ist.
Bei der Serialisierung wird ein vorhandenes Objekt einfach in ein Byte-Array umgewandelt. Dieses Byte-Array repräsentiert die Klasse des Objekts, die Version des Objekts und den internen Status des Objekts. Dieses Byte-Array kann dann zwischen JVMs verwendet werden, die denselben Code ausführen, um das Objekt zu übertragen / zu lesen.
Warum sollten wir das tun wollen?
Es gibt verschiedene Gründe:
Kommunikation: Wenn Sie über zwei Computer verfügen, auf denen derselbe Code ausgeführt wird und die kommunizieren müssen, kann ein Computer auf einfache Weise ein Objekt mit Informationen erstellen, die er übertragen möchte, und dieses Objekt dann auf den anderen Computer serialisieren. Es ist nicht die beste Kommunikationsmethode, aber es erledigt die Arbeit.
Persistenz: Wenn Sie den Status einer bestimmten Operation in einer Datenbank speichern möchten, kann diese einfach in ein Byte-Array serialisiert und zum späteren Abrufen in der Datenbank gespeichert werden.
Deep Copy: Wenn Sie eine exakte Replik eines Objekts benötigen und sich nicht die Mühe machen möchten, Ihre eigene spezialisierte clone () -Klasse zu schreiben, serialisieren Sie das Objekt einfach in ein Byte-Array und de-serialisieren Sie es dann in ein anderes Objekt erreicht dieses Ziel.
Caching: Eigentlich nur eine Anwendung der oben genannten, aber manchmal dauert das Erstellen eines Objekts 10 Minuten, das De-Serialisieren jedoch nur 10 Sekunden. Anstatt das riesige Objekt im Speicher festzuhalten, speichern Sie es einfach per Serialisierung in einer Datei und lesen Sie es später ein, wenn es benötigt wird.
JVM-übergreifende Synchronisation: Die Serialisierung funktioniert über verschiedene JVMs hinweg, die möglicherweise auf verschiedenen Architekturen ausgeführt werden.
quelle
Während Sie Ihre Anwendung ausführen, werden alle Objekte im Arbeitsspeicher (RAM) gespeichert. Beim Beenden wird dieser Speicher vom Betriebssystem zurückgefordert, und Ihr Programm "vergisst" im Wesentlichen alles, was während der Ausführung passiert ist. Die Serialisierung behebt dieses Problem, indem Ihre Anwendung Objekte auf der Festplatte speichert, damit sie sie beim nächsten Start wieder lesen kann. Wenn Ihre Anwendung eine Möglichkeit zum Speichern / Freigeben eines vorherigen Status bietet, benötigen Sie eine Form der Serialisierung.
quelle
Ich kann meine Geschichte teilen und hoffe, dass sie einige Ideen gibt, warum eine Serialisierung notwendig ist. Die Antworten auf Ihre Frage sind jedoch bereits bemerkenswert detailliert.
Ich hatte mehrere Projekte, die eine Reihe von Textdateien laden und lesen müssen. Die Dateien enthielten Stoppwörter, biomedizinische Verben, biomedizinische Abkürzungen, semantisch miteinander verbundene Wörter usw. Der Inhalt dieser Dateien ist einfach: Wörter !
Jetzt musste ich für jedes Projekt die Wörter aus jeder dieser Dateien lesen und sie in verschiedene Arrays einfügen. Da sich der Inhalt der Datei nie geändert hat, wurde sie nach dem ersten Projekt zu einer allgemeinen, jedoch redundanten Aufgabe.
Also habe ich ein Objekt erstellt, um jede dieser Dateien zu lesen und einzelne Arrays (Instanzvariablen der Objekte) zu füllen. Dann habe ich die Objekte serialisiert und für die späteren Projekte einfach deserialisiert. Ich musste die Dateien nicht lesen und die Arrays immer wieder füllen.
quelle
Im Wesentlichen :
Siehe Verwendungen aus dem Wiki :
Die Serialisierung hat eine Reihe von Vorteilen. Es bietet:
quelle
Am offensichtlichsten ist, dass Sie die serialisierte Klasse über ein Netzwerk übertragen können und der Empfänger ein Duplikat der ursprünglichen Instanz erstellen kann. Ebenso können Sie eine serialisierte Struktur in einem Dateisystem speichern.
Beachten Sie außerdem, dass die Serialisierung rekursiv ist, sodass Sie bei Bedarf eine gesamte heterogene Datenstruktur in einem Swell-Foop serialisieren können.
quelle
Serialisierte Objekte behalten ihren Status im Raum bei, sie können über das Netzwerk, das Dateisystem usw. übertragen werden, und zeitlich können sie die JVM überleben, die sie erstellt hat.
Manchmal ist das nützlich.
quelle
Ich verwende serialisierte Objekte, um die Argumente zu standardisieren, die ich an Funktionen oder Klassenkonstruktoren übergebe. Das Übergeben einer serialisierten Bean ist viel sauberer als eine lange Liste von Argumenten. Das Ergebnis ist Code, der einfacher zu lesen und zu debuggen ist.
quelle
Für den einfachen Zweck des Lernens (beachten Sie, ich sagte Lernen, ich sagte nicht das Beste oder sogar das Gute, aber nur um die Dinge zu verstehen), könnten Sie Ihre Daten in einer Textdatei auf dem Computer speichern und dann ein Programm haben Das liest diese Informationen und basierend auf der Datei könnte Ihr Programm anders reagieren. Wenn Sie fortgeschrittener wären, müsste es nicht unbedingt eine txt-Datei sein, sondern etwas anderes.
Durch die Serialisierung werden die Dinge direkt in die Computersprache gebracht. Es ist, als würden Sie einem spanischen Computer etwas auf Spanisch erzählen, anstatt ihm etwas auf Französisch zu sagen, und ihn dazu zwingen, Französisch zu lernen, und dann die Dinge in sein Mutterspanisch speichern, indem Sie alles übersetzen. Nicht die technisch intensivste Antwort, ich versuche nur, ein verständliches Beispiel in einem gemeinsamen Sprachformat zu erstellen.
Die Serialisierung ist auch schneller, da Objekte in Java auf dem Heap verarbeitet werden und viel länger dauern, als wenn sie als Grundelemente auf dem Stapel dargestellt würden. Geschwindigkeit, Geschwindigkeit, Geschwindigkeit. Und weniger Dateiverarbeitung aus Sicht des Programmierers.
quelle