Was ist mit "Objektserialisierung" gemeint? Können Sie das bitte anhand einiger Beispiele erklären?
Antworten
Zu viele Anzeigen?Serialisierung ist die Umwandlung eines Objekts in eine Reihe von Bytes, so dass das Objekt leicht in einem dauerhaften Speicher gespeichert oder über eine Kommunikationsverbindung gestreamt werden kann. Der Bytestrom kann dann deserialisiert werden, d. h. in ein Abbild des ursprünglichen Objekts umgewandelt werden.
Sie können sich die Serialisierung als den Prozess der Umwandlung einer Objektinstanz in eine Folge von Bytes vorstellen (die je nach Implementierung binär oder nicht binär sein kann).
Es ist sehr nützlich, wenn Sie Daten eines Objekts über das Netzwerk übertragen wollen, z. B. von einer JVM zu einer anderen.
In Java ist der Serialisierungsmechanismus in die Plattform integriert, aber Sie müssen die Serialisierbar Schnittstelle, um ein Objekt serialisierbar zu machen.
Sie können auch verhindern, dass einige Daten in Ihrem Objekt serialisiert werden, indem Sie das Attribut als transient .
Schließlich können Sie den Standardmechanismus außer Kraft setzen und Ihren eigenen Mechanismus bereitstellen; dies kann in einigen speziellen Fällen sinnvoll sein. Dazu verwenden Sie eine der verborgene funktionen in java .
Es ist wichtig zu beachten, dass der "Wert" des Objekts bzw. der Inhalt serialisiert wird und nicht die Klassendefinition. Methoden werden also nicht serialisiert.
Hier ist ein sehr einfaches Beispiel mit Kommentaren, um das Lesen zu erleichtern:
import java.io.*;
import java.util.*;
// This class implements "Serializable" to let the system know
// it's ok to do it. You as programmer are aware of that.
public class SerializationSample implements Serializable {
// These attributes conform the "value" of the object.
// These two will be serialized;
private String aString = "The value of that string";
private int someInteger = 0;
// But this won't since it is marked as transient.
private transient List<File> unInterestingLongLongList;
// Main method to test.
public static void main( String [] args ) throws IOException {
// Create a sample object, that contains the default values.
SerializationSample instance = new SerializationSample();
// The "ObjectOutputStream" class has the default
// definition to serialize an object.
ObjectOutputStream oos = new ObjectOutputStream(
// By using "FileOutputStream" we will
// Write it to a File in the file system
// It could have been a Socket to another
// machine, a database, an in memory array, etc.
new FileOutputStream(new File("o.ser")));
// do the magic
oos.writeObject( instance );
// close the writing.
oos.close();
}
}
Wenn wir dieses Programm ausführen, wird die Datei "o.ser" erstellt, und wir können sehen, was dahinter passiert.
Wenn wir den Wert von ändern: someInteger zum Beispiel Integer.MAX_VALUE können wir die Ausgabe vergleichen, um zu sehen, wo der Unterschied liegt.
Hier ist ein Bildschirmfoto, das genau diesen Unterschied zeigt:
Können Sie die Unterschiede erkennen? ;)
In der Java-Serialisierung gibt es ein zusätzliches relevantes Feld: Die serialversionUID aber ich denke, das ist schon zu lang, um es zu behandeln.
Ich wage es, die 6 Jahre alte Frage zu beantworten und füge nur ein sehr grundlegendes Verständnis für Java-Neulinge hinzu
Was ist Serialisierung?
Umwandlung eines Objekts in Bytes
Was ist Deserialisierung?
Konvertierung von Bytes zurück in ein Objekt (Deserialisierung).
Wann wird die Serialisierung verwendet?
Wenn wir das Objekt persistieren wollen. Wenn das Objekt über die Lebensdauer der JVM hinaus existieren soll.
Beispiel aus der Praxis:
ATM: Wenn der Kontoinhaber versucht, über einen Geldautomaten Geld vom Server abzuheben, werden die Informationen des Kontoinhabers, wie z. B. die Abhebungsdaten, serialisiert und an den Server gesendet, wo die Daten deserialisiert und zur Durchführung von Operationen verwendet werden.
Wie die Serialisierung in Java durchgeführt wird.
-
Umsetzung
java.io.Serializable
Schnittstelle (Marker-Schnittstelle, also keine Methode zu implementieren). -
Persistieren Sie das Objekt: Verwenden Sie
java.io.ObjectOutputStream
Klasse, einem Filterstrom, der einen Bytestrom der unteren Ebene umhüllt (um ein Objekt in ein Dateisystem zu schreiben oder ein reduziertes Objekt über eine Netzwerkleitung zu übertragen und auf der anderen Seite wiederherzustellen).
writeObject(<<instance>>)
- ein Objekt zu schreibenreadObject()
- um ein serialisiertes Objekt zu lesen
Erinnern Sie sich:
Wenn Sie ein Objekt serialisieren, wird nur der Zustand des Objekts gespeichert, nicht aber die Klassendatei oder die Methoden des Objekts.
Wenn Sie ein 2-Byte-Objekt serialisiert haben, sehen Sie 51 Bytes serialisierte Datei.
Steuert, wie das Objekt serialisiert und de-serialisiert wird.
Antwort für: Wie wurde die Datei in 51 Bytes umgewandelt?
- Schreibt zunächst die magischen Daten des Serialisierungsstroms (STREAM_MAGIC= "AC ED" und STREAM_VERSION=Version der JVM).
- Dann werden die Metadaten der mit einer Instanz verbundenen Klasse ausgegeben (Länge der Klasse, Name der Klasse, serialVersionUID).
- Dann werden die Metadaten der Superklasse rekursiv ausgeschrieben, bis sie die
java.lang.Object
. - Dann beginnt er mit den eigentlichen Daten, die mit der Instanz verbunden sind.
- Schreibt schließlich die Daten der mit der Instanz verbundenen Objekte, angefangen von den Metadaten bis hin zum eigentlichen Inhalt.
können Sie auch meine Youtube-Video Erklärung hier
Modifier : Referenz enlace zu lesen.
Damit werden einige häufig gestellte Fragen beantwortet:
-
Wie man ein Feld in der Klasse nicht serialisiert.
Antwort: Verwenden Sie das Schlüsselwort transient -
Wenn die untergeordnete Klasse serialisiert wird, wird dann auch die übergeordnete Klasse serialisiert?
Antwort: Nein, wenn ein übergeordnetes Element die Serializable-Schnittstelle nicht erweitert, wird das übergeordnete Feld nicht serialisiert. -
Wenn eine übergeordnete Klasse serialisiert wird, wird dann auch die untergeordnete Klasse serialisiert?
Antwort: Ja, standardmäßig wird auch die untergeordnete Klasse serialisiert. -
Wie kann man verhindern, dass eine untergeordnete Klasse serialisiert wird?
Ans: a. Überschreiben Sie die Methoden writeObject und readObject und werfen SieNotSerializableException
.b. Sie können auch alle Felder in der untergeordneten Klasse als transient markieren.
-
Einige Klassen auf Systemebene wie Thread, OutputStream und seine Unterklassen sowie Socket sind nicht serialisierbar.
Ich mag die Art und Weise, wie @OscarRyz präsentiert. Auch wenn ich hier weiter die Geschichte der Serialisierung der ursprünglich von @amitgupta geschrieben wurde.
Obwohl die Wissenschaftler der Erde die Struktur der Roboterklassen kennen und die Daten serialisiert haben, konnten sie die Daten nicht deserialisieren, so dass die Roboter nicht funktionieren.
Exception in thread "main" java.io.InvalidClassException:
SerializeMe; local class incompatible: stream classdesc
:
Die Wissenschaftler auf dem Mars warteten auf die vollständige Bezahlung. Sobald die Zahlung erfolgt war, teilten die Wissenschaftler des Mars die serialversionUID mit den Wissenschaftlern der Erde. Der Wissenschaftler von der Erde stellte es auf Roboterklasse ein und alles wurde gut.
- See previous answers
- Weitere Antworten anzeigen