Was ist der Zweck der Serialisierung in Java?

105

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.

m_a_khan
quelle
10
Was "überzeugte nicht" an ihren Argumenten? Und warum haben Sie keine Antworten auf Ihre Fragen akzeptiert?
Anon.
8
Er "war nicht überzeugt", sie beantworteten seine Fragen.
Anthony Forloney
5
Die Antworten waren in der Tat richtig. Wenn sie für Sie nicht funktionieren, antworten Sie ihnen als Kommentare und versuchen Sie es herauszufinden, anstatt sie einfach zu ignorieren und dann andere zu entflammen, wenn sie darauf hinweisen, dass Sie SO nicht richtig verwenden.
Anon.
4
Anon trägt zur Qualität der Website bei, indem es doppelte Fragen abschreckt. Es ist albern, fünf verschiedene Fragen zu sehen, die alle dasselbe stellen. Wenn Sie keine Antwort bekommen, ist es manchmal so. Wenn Sie eine Antwort erhalten, diese jedoch nicht zu funktionieren scheint, setzen Sie die Diskussion in den Kommentaren fort. SO ist keine magische Kiste, die Ihnen auf magische Weise eine Antwort gibt, wenn Sie nur die richtige Frage stellen oder genügend oft fragen oder die Aufmerksamkeit des richtigen Experten auf sich ziehen.
Chris
1
Entweder: (Akzeptiere die Antwort) oder (Schreibe einen Kommentar und / oder ändere die Frage, warum es nicht das ist, was du brauchst).
Anon.

Antworten:

182

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.

Schmelter
quelle
62
Was um alles in der Welt braucht 10 Minuten, um zu bauen?
oxbow_lakes
2
Mein Punkt ist (natürlich), dass die an der Serialisierung beteiligten Datei-E / A wahrscheinlich den Aufwand für die reine Objekterstellung in den Schatten stellen. Ich nehme an, Sie sprechen über etwas rechenintensives wie die wissenschaftliche Modellierung, aber die Serialisierung ist ein sehr schlechter Mechanismus für die Persistenz, da es schwierig ist,
Schemaänderungen
11
@oxbow_lakes Ein Beispiel könnte sein, wenn Sie einen Index eines bestimmten Datensatzes für eine schnelle Suche verwalten. Das Erstellen eines solchen Index kann sehr lange dauern, aber sobald Sie ihn erstellt haben, kann er relativ schnell serialisiert / de-serialisiert werden.
David
Wenn die Web-App-Anforderung jeden Router auf der Welt durchlaufen muss, bevor sie das Ziel erreicht, ein Objekt erstellt und mit dem Objekt auf dem längstmöglichen Pfad zurückkehrt, kann dies 10 Minuten dauern.
Vaibs
@Schmelter, Da Sie erwähnen, dass Serialisierung nicht die beste Kommunikationsmethode ist, welche ist dann die passende und beste Methode, um sie zu implementieren?
Ashfaque Rifaye
58

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.

Gordon Gustafson
quelle
2
Es scheint also nur eine bessere und effizientere Möglichkeit zu sein, Daten in eine Datei zu schreiben und sie bei Bedarf zurückzulesen?
m_a_khan
1
Dies ist die einzige echte Erklärung. Ich kann mir keine andere reale Anwendung der Serialisierung +1
Emily
Kurz und bündig. Perfekte Erklärung.
Yakhoob
21

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.

Rushdi Shams
quelle
1
Warum sollte es in einem solchen Fall einfacher sein, sie nur im Byte-Array-Stream zu speichern (mithilfe von Serialize), als nur ein temporäres Feld zu verwenden?
Kidnan1991
3

Im Wesentlichen :

Bei der Serialisierung wird eine Reihe von Objektinstanzen, die Verweise aufeinander enthalten, in einen linearen Bytestrom konvertiert, der dann über einen Socket gesendet, in einer Datei gespeichert oder einfach als Datenstrom bearbeitet werden kann

Siehe Verwendungen aus dem Wiki :

Die Serialisierung hat eine Reihe von Vorteilen. Es bietet:

  1. Eine Methode zum Beibehalten von Objekten, die bequemer ist, als ihre Eigenschaften in eine Textdatei auf der Festplatte zu schreiben und sie durch erneutes Einlesen neu zusammenzusetzen.
  2. Eine Methode zum Ausgeben von Remoteprozeduraufrufen, z. B. wie in SOAP
  3. eine Methode zum Verteilen von Objekten, insbesondere in Softwarekomponenten wie COM, CORBA usw.
  4. ein Verfahren zum Erkennen von Änderungen in zeitvariablen Daten.
Schwimmbad
quelle
1

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.

ddyer
quelle
0

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.

David Soroko
quelle
Dies kann mit einer einfachen Datei erreicht werden, die auch Text enthält. Es ist etwas einfacher, ein serialisiertes Objekt zurückzulesen, als den Status des Objekts zu lesen, das in eine Textdatei geschrieben wurde, richtig?
m_a_khan
@m_a_khan: Wow. Ja, es kann mit einem einfachen Text gemacht werden. Sobald Objekte jedoch komplexer werden oder ihre Strukturen (Zusammensetzung, Vererbung) komplexer werden, wird es mühsam, sie manuell (un) zu marshallen. Stellen Sie sich vor, Sie hätten Listen, Mengen und Karten als Objektmitglieder.
Dirk Schumacher
Es ist einfach, verschiedene Serialisierungsschemata zu entwickeln, und tatsächlich existieren viele. Aus sehr guten Gründen führt keiner von ihnen im allgemeinen Fall zu einem "einfachen Text"
David Soroko
0

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.

Ron Norman
quelle
1
Meiner Meinung nach sind Searialisierung und die Verwendung eines einzelnen Konfigurationsobjekts als Parameter ziemlich orthogonal. Wahrscheinlich ist dies kein typischer Anwendungsfall.
Gábor Bakos
0

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.

JCoder
quelle
Beim Versuch, die Dinge in einfachem Englisch zu formulieren, haben Sie die Serialisierung nicht wirklich auf nützliche Weise erklärt.
user3516726