JavaRush /Java-Blog /Random-DE /Die 13 häufigsten Fragen zur Serialisierung in Vorstellun...
Dmitry Vasilyev
Level 26
Саратов

Die 13 häufigsten Fragen zur Serialisierung in Vorstellungsgesprächen

Veröffentlicht in der Gruppe Random-DE
Übersetzung des Artikels https://javarevisited.blogspot.com/2011/04/top-10-java-serialization-interview.html Was ist Serialisierung in Java? Serialisierung ist eines der wichtigen Konzepte, das recht selten als Lösung zum Speichern des Programmstatus verwendet wird. Daher wird diese API von Entwicklern häufig übersehen. Meiner Erfahrung nach ist die Serialisierung jedoch ein ziemlich wichtiges Thema in jedem grundlegenden Java-Interview. In fast jedem Vorstellungsgespräch, das ich erlebt habe, wurden ein oder zwei Fragen zur Serialisierung gestellt, und ich habe erlebt, dass Kandidaten sich nach ein paar Fragen zu diesem Thema unwohl fühlten, weil sie in diesem Bereich keine Erfahrung hatten. Sie wissen nicht, wie man ein Objekt in Java serialisiert, sie kennen keine Beispiele für Serialisierung und können die Mechanik ihrer Arbeit nicht erklären, den Unterschied zwischen einer transienten und einer flüchtigen Variablen, sie wissen nicht, wie viele Methoden die Serialisierbare Schnittstelle hat hat. Was ist eine Markerschnittstelle? Was ist seine Aufgabe? Was ist der Unterschied zwischen der externalisierbaren und der serialisierbaren Implementierung in Java? Warum hat Java nach der Einführung der Annotation Serializable nicht durch @Serializable ersetzt? In diesem Artikel behandeln wir Fragen sowohl für Anfänger als auch für fortgeschrittene Entwickler, die für alle gleichermaßen nützlich sein können: vom Junior- bis zum Senior-Entwickler. Die meisten kommerziellen Projekte verwenden entweder Datenbanken, speicherabgebildete Dateien oder einfach einfache Flatfiles, um eine größere Robustheit zu gewährleisten, aber nur wenige verlassen sich auf den Serialisierungsprozess von Java. Auf jeden Fall handelt es sich bei diesem Beitrag nicht um ein Tutorial – es geht vielmehr um Fragen, die es wert sind, selbst geklärt zu werden, bevor man in ein Java-Interview geht und sich von Begriffen überraschen lässt, die einem selbst unbekannt sind. Für diejenigen, die mit der Java-Serialisierung überhaupt nicht vertraut sind: „Serialisierung in Java ist ein Prozess, der verwendet wird, um ein Objekt in Java zu serialisieren , indem der Status des Objekts in einer Datei mit der Erweiterung .ser gespeichert und der Status des Objekts neu erstellt wird.“ aus dieser Datei. Dieser umgekehrte Vorgang wird Deserialisierung genannt. Sepulka Die Java Serialization API bietet Entwicklern einen Standardmechanismus zum Serialisieren von Objekten mithilfe der Schnittstellen Serializable und Externalizable. Dieser Artikel ist übrigens eine Fortsetzung meiner ( nicht meiner, des Übersetzers, sondern des Autors des englischen Originals) vorherigen Artikel: 20 Interviewfragen zu Designmustern und 10 Interviewfragen zum Singleton-Muster in Java . So lass uns gehen! Was ist Serialisierung in Java? Bei der Objektserialisierung in Java handelt es sich um einen Prozess, mit dem ein Objekt in ein Binärformat konvertiert wird, das auf der Festplatte gespeichert oder über das Netzwerk an jede andere laufende Java-VM gesendet werden kann. Der umgekehrte Vorgang der Erstellung eines Objekts aus einem Binärstrom wird Deserialisierung genannt. Java bietet eine API, die java.io.Serializable, java.io.Externalizable, ObjectInputStream und ObjectOutputStream usw. umfasst. Programmierern steht es frei, den Standard-Serialisierungsmechanismus zu verwenden, den Java basierend auf der Klassenstruktur verwendet. Sie können jedoch auch ihr eigenes benutzerdefiniertes Binärformat verwenden, das häufig als Best Practice für die Serialisierung empfohlen wird, da das serialisierte Binärformat Teil der exportierten API der Klasse wird und kann möglicherweise die Kapselung in Java zerstören, die durch private und paketprivate Felder bereitgestellt wird. Im Allgemeinen werden diese Informationen völlig ausreichen, um loszulegen. Wie mache ich eine Java-Klasse serialisierbar? Es ist sehr leicht. Ihre Klasse muss lediglich die Schnittstelle java.io.Serializable implementieren und die JVM kümmert sich um die Serialisierung des Objekts in einem Standardformat. Die Entscheidung, eine serialisierbare Klasse zu erstellen, sollte kurz getroffen werden, denn obwohl die kurzfristigen Kosten für die Erstellung einer serialisierbaren Klasse gering sind, sind die langfristigen Kosten erheblich und können möglicherweise Ihre Möglichkeiten einschränken, weitere Änderungen an der Implementierung vorzunehmen. Dies liegt daran, dass wie bei jeder öffentlichen API die serialisierte Form eines Objekts Teil der öffentlichen API wird und wenn Sie die Struktur Ihrer Klasse durch die Implementierung einer Add-Schnittstelle ändern, kann das Hinzufügen oder Entfernen eines Felds möglicherweise die Standardserialisierung zerstören. Dies kann zwar durch die Verwendung eines benutzerdefinierten Binärformats minimiert werden, erfordert aber dennoch einen hohen Aufwand, um die Abwärtskompatibilität sicherzustellen. Ein Beispiel dafür, wie die Serialisierung Ihre Möglichkeiten zum Ändern einer Klasse einschränken kann, ist das Feld SerialVersionUID. Wenn Sie die SerialVersionUID nicht explizit deklarieren, generiert die virtuelle Maschine sie basierend auf der Klassenstruktur, die von den von der Klasse implementierten Schnittstellen und mehreren anderen Faktoren abhängt, die geändert werden können. Nehmen wir an, Sie implementieren eine andere Schnittstelle als die JVM, die eine andere SerialVersionUID für die neue Version der Klassendateien generiert, und wenn Sie versuchen, ein altes Objekt zu laden, das von der alten Version Ihres Programms serialisiert wurde, erhalten Sie eine InvalidClassException. Frage 1) Was ist der Unterschied zwischen einer serialisierbaren und einer externalisierbaren Schnittstelle in Java? Dies ist die am häufigsten gestellte Frage in Vorstellungsgesprächen zur Java-Serialisierung. Die Externalizable-Schnittstelle stellt uns die Methoden writeExternal() und readExternal() zur Verfügung, die uns die Flexibilität geben, die Serialisierung zu steuern, anstatt uns auf den Standardmechanismus zu verlassen. Durch die ordnungsgemäße Implementierung der Externalizable-Schnittstelle kann die Anwendungsleistung erheblich verbessert werden. Frage 2) Wie viele Methoden verfügt Serializable? Wenn es keine Methode gibt, welchen Zweck hat dann die Serializable-Schnittstelle? Die serialisierbare Schnittstelle ist im Paket java.io enthalten und bildet den Kern der Serialisierungs-Engine von Java. Es verfügt über keine Methoden und wird in Java auch Marker-Schnittstelle genannt . Wenn Ihre Klasse die Schnittstelle java.io.Serializable implementiert, wird sie serialisierbar. Es ist einfach. Frage 3) Was ist serialVersionUID? Was passiert, wenn Sie es nicht definieren? Eine meiner liebsten Interviewfragen zur Java-Serialisierung. SerialVersionUID ist eine Kennung, die einem Objekt bei der Serialisierung zugewiesen wird, normalerweise ein Hash-Code des Objekts. Sie können das Tool serialver verwenden, um die serialVersionUID des serialisierten Objekts abzurufen. SerialVersionUID wird zur Objektversionskontrolle verwendet. Sie können serialVersionUID auch manuell in Ihrer Klassendatei angeben. Wenn Sie serialVersionUID nicht angeben, hat dies zur Folge, dass die bereits serialisierte Klasse nicht wiederhergestellt werden kann, wenn Sie ein Feld in einer Klasse hinzufügen oder ändern, da sich die für die neue Klasse generierte serialVersionUID vom gleichen Feld des alten serialisierten Objekts unterscheidet. Der Java-Serialisierungsprozess verlässt sich auf die richtige serialVersionUID, um den Status des serialisierten Objekts wiederherzustellen, und löst bei einer Nichtübereinstimmung eine java.io.InvalidClassException aus. Weitere Informationen zu serialversionuid finden Sie hier . Frage 4) Möchten Sie, dass einige Elemente bei der Serialisierung nicht serialisiert werden? Wie erreicht man das? Eine weitere häufig gestellte Frage in Vorstellungsgesprächen zur Serialisierung. Manchmal wird auch gefragt, wie eine transiente Variable verwendet wird, ob eine transiente und eine statische Variable serialisiert sind oder nicht usw. Wenn Sie also nicht möchten, dass ein Feld Teil des Objektstatus ist, deklarieren Sie es je nach Status als statisch oder transient auf Ihre Bedürfnisse zugeschnitten und wird nicht in den Java-Serialisierungsprozess einbezogen. Frage 5) Was passiert, wenn eines der Klassenmitglieder die Serializable-Schnittstelle nicht implementiert? Eine der einfachen Fragen zum Serialisierungsprozess in Java. Wenn Sie versuchen, ein Objekt einer Klasse zu serialisieren, die Serializable implementiert, das Objekt jedoch einen Verweis auf eine Klasse enthält, die nicht Serializable ist, wird zur Laufzeit eine NotSerializableException ausgelöst, und deshalb füge ich immer einen SerializableAlert (Kommentarabschnitt) in meine ein Code), besteht eine der besten Techniken zum Kommentieren von Code darin, den Entwickler anzuweisen, sich diese Tatsache zu merken, wenn er der Klasse Serializable ein neues Feld hinzufügt. Frage 6) Wenn eine Klasse serialisierbar ist, ihre Oberklasse jedoch nicht, wie wird dann der Zustand der von der Oberklasse geerbten Instanzvariablen nach der Deserialisierung sein? Der Java-Serialisierungsprozess wird nur in der Objekthierarchie fortgesetzt, solange die Klasse die Serializable-Schnittstelle implementiert und die Werte der von der Superklasse geerbten Variablen durch Aufrufen des Konstruktors der nicht serialisierbaren Superklasse während des Deserialisierungsprozesses initialisiert werden. Sobald die Konstruktorkette gestartet ist, gibt es keine Möglichkeit , sie zu stoppen. Daher wird der Konstruktor ausgeführt , selbst wenn Klassen weiter oben in der Hierarchie die Serializable-Schnittstelle implementieren (nicht) . Diese Frage im Serialisierungsinterview mag sehr schwierig erscheinen, aber wenn Sie mit den Schlüsselkonzepten vertraut sind, wird es nicht schwierig sein. Frage 7) Können Sie den Serialisierungsprozess anpassen oder den Standard-Serialisierungsprozess in Java überschreiben? Die Antwort lautet: Ja, das können Sie. Wir alle wissen, dass zum Serialisieren eines Objekts ObjectOutputStream.writeObject(saveThisObject) aufgerufen wird und zum Lesen eines Objekts ObjectInputStream.readObject() aufgerufen wird, aber die Java Virtual Machine bietet Ihnen noch etwas anderes: die Definition dieser beiden Methoden in deiner Klasse. Wenn Sie sie in Ihrer Klasse definieren, ruft die JVM diese beiden Methoden auf, anstatt den Standard-Serialisierungsmechanismus zu verwenden. Hier können Sie das Serialisierungs- und Deserialisierungsverhalten des Objekts konfigurieren, indem Sie eine beliebige Vorverarbeitungs- oder Nachverarbeitungsaufgabe ausführen. Es ist wichtig zu beachten, dass diese Methoden privat sein müssen, um Vererbung, Überschreibung oder Überladung zu vermeiden. Da nur die Java Virtual Machine eine private Methode aufrufen kann, bleibt die Integrität Ihrer Klasse erhalten und die Serialisierung funktioniert wie gewohnt. Meiner Meinung nach ist dies eine der besten Fragen, die man in jedem Interview zur Java-Serialisierung stellen kann. Eine gute Folgefrage lautet: Warum sollten Sie ein benutzerdefiniertes serialisiertes Formular für Ihr Objekt bereitstellen? Frage 8) Angenommen, die Oberklasse einer neuen Klasse implementiert die Serializable-Schnittstelle. Wie können wir die Serialisierung der neuen Klasse vermeiden? Eine der schwierigsten Interviewfragen zur Serialisierung in Java. Wenn die Oberklasse einer Klasse bereits die Serializable-Schnittstelle in Java implementiert, ist auch die Nachkommenklasse serialisierbar, da Sie die Schnittstelle der übergeordneten Klasse nicht implementieren können und es nicht wirklich möglich ist, sie zu einer nicht serialisierbaren Klasse zu machen. Es gibt jedoch eine Möglichkeit, die Serialisierung für diese neue Klasse zu vermeiden. Dazu müssen Sie die Methoden writeObject() und readObject() implementieren und von diesen Methoden eine NotSerializableException auslösen. Diese Frage wird normalerweise im Verlauf des Interviews als Zusatzfrage gestellt. Frage 9) Welche Methoden werden beim Serialisierungs- und Deserialisierungsprozess in Java verwendet? Dies ist eine sehr häufige Frage bei der Serialisierung. Was möchte der Interviewer in diesem Fall herausfinden? Unabhängig davon, ob Sie mit der Verwendung von readObject(), writeObject(), readExternal() und writeExternal() vertraut sind oder nicht. Die Java-Serialisierung erfolgt durch die Klasse java.io.ObjectOutputStream. Bei dieser Klasse handelt es sich um einen gefilterten Stream, der um einen Bytestream einer niedrigeren Ebene gewickelt wird, um die Serialisierungs-Engine zu verwalten. Um ein beliebiges Objekt mithilfe des Serialisierungsmechanismus zu speichern, rufen wir ObjectOutputStream.writeObject(saveThisObject) auf und um dieses Objekt zu deserialisieren, rufen wir die Methode ObjectInputStream.readObject() auf. Der Aufruf der Methode writeObject() startet den Serialisierungsprozess. Bei der Methode readObject() ist zu beachten, dass sie zum Lesen von Bytes und zum Erstellen und Zurückgeben eines Objekts aus diesen Bytes verwendet wird, das wiederum in den richtigen Typ umgewandelt werden muss. Frage 10) Angenommen, Sie haben eine Klasse, die Sie serialisiert und gespeichert haben, und dann ändern Sie diese Klasse, um ein neues Feld hinzuzufügen. Was passiert, wenn Sie ein bereits serialisiertes Objekt deserialisieren? Es hängt davon ab, ob die Klasse eine eigene serialVersionUID hat oder nicht. Wie wir aus den obigen Fragen wissen, generiert der Java-Compiler die SerialVersionUID selbst, wenn wir in unserem Code keine SerialVersionUID angeben, und normalerweise entspricht sie dem Hash-Code dieses Objekts. Nach dem Hinzufügen eines neuen Felds besteht die Möglichkeit, dass die für diese Version der Klasse generierte neue serialVersionUID nicht mit dem bereits serialisierten Objekt übereinstimmt. In diesem Fall löst die API eine java.io.InvalidClassException aus. Aus diesem Grund wird empfohlen, in Ihrem Code eine eigene serialVersionUID zu haben, die für dieselbe Klasse immer gleich ist. Frage 11) Welche kompatiblen und inkompatiblen Änderungen gibt es im Java-Serialisierungsmechanismus? Das eigentliche Problem besteht darin, die Struktur von Klassen zu ändern, indem ein Feld oder eine Methode hinzugefügt oder ein Feld oder eine Methode mit einem bereits serialisierten Objekt entfernt wird. Gemäß der Java-Serialisierungsspezifikation fällt das Hinzufügen eines beliebigen Felds oder einer Methode unter kompatible Änderungen und Änderungen. Klassenhierarchie oder UN-Implementierung serialisierbarer Schnittstellen (einige davon unter nicht kompatible Änderungen). Für eine vollständige Liste der kompatiblen und inkompatiblen Änderungen empfehle ich die Lektüre der Java Serialization Specification. Frage 12) Können wir ein serialisiertes Objekt über das Netzwerk übertragen? Ja, Sie können ein serialisiertes Objekt über das Netzwerk weitergeben, da ein in Java serialisiertes Objekt eine Sammlung von Bytes ist, die auf beliebige Weise weitergegeben werden können. Sie können das serialisierte Objekt auch als Blob auf der Festplatte oder in einer Datenbank speichern. Frage 13) Welche Arten von Variablen werden während der Java-Serialisierung nicht serialisiert? Diese Frage wurde manchmal anders gestellt, aber das Ziel ist dasselbe: herauszufinden, ob ein Java-Entwickler die Besonderheiten der Serialisierung statischer und transienter Variablen kennt. Da statische Variablen zu einer Klasse und nicht zu einem Objekt gehören, sind sie nicht Teil des Objektstatus und werden daher während des Java-Serialisierungsprozesses nicht beibehalten. Da die Java-Serialisierung nur den Status eines Objekts und nicht das Objekt selbst speichert, werden transiente Variablen ebenfalls nicht in den Serialisierungsprozess einbezogen und sind nicht Teil des serialisierten Status des Objekts. Nach dieser Frage wird der Interviewer vielleicht fragen: Wenn Sie die Werte dieser Variablen nicht speichern, welchen Wert haben diese Variablen dann nach der Deserialisierung und Neuerstellung dieses Objekts? Und das, Kollegen, denken Sie selbst :) Der Originalartikel ist hier .
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION