Ist ein deserialisiertes Objekt dieselbe Instanz wie das Original?

Charlie Olson:

Wenn ich ein Objekt aus einer Klasse instanziiere, wird ein Objekt im Java-Heap gespeichert. Wenn ich das Objekt durch Serialisierung speichere und später das Objekt deserialisiere, verstehe ich richtig, dass das Objekt jetzt eine neue Heap-Adresse hat, aber immer noch die EXAKT GLEICHE Instanz der Klasse ist.

Anshuman:

Die Antwort auf Ihre Frage kann nicht nur ein Ja oder Nein sein. Zur Analyse des Konzepts ist erforderlich. Ich werde Ihnen vorschlagen, einen Bleistift und Papier zu nehmen und es selbst zu tun, wobei Sie die folgenden Punkte beachten.

  • Alle Java-Objekte werden im Java-Heap erstellt (mit Ausnahme einiger Objekte, die im Pool gespeichert sind, aber für Ihre Frage werden wir sie vorerst überspringen).
  • Wenn eine Instanz einer Klasse mit dem neuen Schlüsselwort, der Deserialisierung, der Klonmethode oder der newInstance-Methode der Reflection-API erstellt wird, wird ein neuer Speicherplatz im Heap reserviert und einer Objektreferenz zugewiesen (die Referenz kann aus der Klasse des Objekts oder einer der Objektreferenzen stammen Superklassen der Klasse des Objekts - wieder können wir dieses Detail vorerst ignorieren).
  • Wenn Sie Ihr Objekt speichern, wird der Status des Objekts mit allen verschachtelten Objekten gespeichert.
  • Wenn Sie Ihr Objekt deserialisieren, erstellt das Objekt einen neuen Eintrag im Heap, der keine Verweise auf eines der Objekte enthält.

Sehen Sie sich das folgende Diagramm an, um das obige Konzept in Ihrem Kontext darzustellen:

Geben Sie hier die Bildbeschreibung ein

Alle Objekt-A-Referenzen verweisen auf einen Heap-Eintrag. Wenn Sie objectB.getObjectA () == objectC.getObjectA () oder eine andere solche Operation versuchen, erhalten Sie true.

Fall 1 Wenn Sie die Objekte separat speichern und deserialisieren, geschieht Folgendes auf dem Heap:

Geben Sie hier die Bildbeschreibung ein

Wie Sie jetzt herausfinden können, gibt objectBcopy.getObjectA () == objectCcopy.getObjectA () nicht true zurück, da die Referenzen von Objekt A für die kopierten Objekte nicht mehr identisch sind.

Fall 2 Im Gegenteil, wenn Sie die Objekte in einer einzelnen Datei speichern und später deserialisieren, geschieht Folgendes auf dem Heap:

Geben Sie hier die Bildbeschreibung ein

Wie Sie jetzt herausfinden können, ist objectBcopy.getObjectA () == objectCcopy.getObjectA () jetzt wahr, da die Referenzen von Objekt A identisch sind, aber das ist immer noch eine neue Kopie von Objekt A.

Ein schnelles Programm zur Unterstützung meiner Abzüge (Fall 1 und Fall 2):

public class Test{

    public static void main (String args[]) throws IOException, ClassNotFoundException{
        A a = new A();

        B b = new B();
        b.a = a;

        C c = new C();
        c.a = a;

        System.out.println("b.a == c.a is " + (b.a == c.a));

        // Case 1 - when two diferent files are used to write the objects
        FileOutputStream fout = new FileOutputStream("c:\\b.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fout);
        oos.writeObject(b);
        oos.close();
        fout.close();

        fout = new FileOutputStream("c:\\c.ser");
        oos = new ObjectOutputStream(fout);
        oos.writeObject(c);
        oos.close();
        fout.close();

        FileInputStream fileIn = new FileInputStream("c:\\b.ser");
        ObjectInputStream in = new ObjectInputStream(fileIn);
        B bCopy = (B) in.readObject();
        in.close();
        fileIn.close();

        fileIn = new FileInputStream("c:\\c.ser");
        in = new ObjectInputStream(fileIn);
        C cCopy = (C) in.readObject();
        in.close();
        fileIn.close();
        System.out.println("Case 1 - bCopy.a == cCopy.a is " + (bCopy.a == cCopy.a));

        // Case 2 - when both the objects are saved in the same file
        fout = new FileOutputStream("c:\\both.ser");
        oos = new ObjectOutputStream(fout);
        oos.writeObject(b);
        oos.writeObject(c);
        oos.close();
        fout.close();


        fileIn = new FileInputStream("c:\\both.ser");
        in = new ObjectInputStream(fileIn);
        bCopy = (B) in.readObject();
        cCopy = (C) in.readObject();
        in.close();
        fileIn.close();
        System.out.println("Case 2 - bCopy.a == cCopy.a is " + (bCopy.a == cCopy.a));
    }
}

class A implements Serializable{

}

class B implements Serializable{
    A a;
}

class C implements Serializable{
    A a;
}

Mit folgender Ausgabe:

 b.a == c.a is true
 Case 1 - bCopy.a == cCopy.a is false
 Case 2 - bCopy.a == cCopy.a is true

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Ist das von einer Objectbox-Abfrage zurückgegebene Objekt dieselbe Instanz wie das Objekt in der ToMany<>-Beziehung?

Wie verwende ich ein deserialisiertes Objekt c#

Wie wandle ich ein deserialisiertes generisches Newton.Json-Objekt in ein benutzerdefiniertes Objekt um?

Garantiert Java, dass das von getClass () zurückgegebene Class-Objekt immer dieselbe Instanz ist?

Wie man erkennt, ob ein Objekt / eine Instanz hashbar ist

Wie ist das ein Objekt {Handler, Kontext}?

Aufruf der richtigen Methode für ein Objekt, wenn das Objekt eine Instanz einer Basisklasse ist

Python OOP: Erstellen Sie ein Objekt, das eine Instanz mehrerer Klassen ist

Ist das Javascript-Objekt ein Datenstrukturname oder eine Instanz einer anderen Klasse?

Wie bekomme ich ein Objekt, das in Kivy animiert ist?

Wie verschiebe ich ein Array, das in einem Objekt verschachtelt ist?

Wie teste ich, ob das Objekt ein Pfadpfad ist?

Wie entferne ich ein Objekt, das in zwei Arrays geschachtelt ist?

Wie speichere ich ein Objekt in einem anderen Objekt, ohne das Original mit struct zu ändern?

Wie kann man verstehen, dass ein inneres Objekt eine Instanz der äußeren Klasse ist?

Wie überprüfe ich, ob ein Objekt eine Instanz eines Namedtupels ist?

Wie überprüfe ich, ob ein Objekt eine Instanz einer Vorlagenklasse in C ++ ist?

Wie kann ich überprüfen, ob ein Objekt eine Instanz einer bestimmten Klasse ist?

Wie kann ich mit Apache Camel mein deserialisiertes Objekt aufheben, das über einen CXF-Endpunkt eingeht?

So serialisieren Sie ein Objekt und wandeln es in dieselbe Klasse wie das ursprüngliche Objekt zurück

Verweis auf dieselbe Instanz in Unittest (keine neue Instanz erstellen, wenn ein Objekt aufgerufen wird)

Warum ist protobuf-net deserialisiertes Objekt nicht "schlank"?

Wie verschiebe ich ein Array auf ein Objekt, das im Objekt nicht vorhanden ist?

Aeson: Wie analysiere ich ein Objekt mit einem Element, das ein String-Objekt ist?

Wie lese ich deserialisiertes Objekt aus AWS-SQS in Java?

Wie Sie ein Objekt in ein Array verschieben, das ein Statusobjekt ist, reagieren Sie mit Typescript

Wie kann ich ein JSON-Objekt, das ein Array enthält, in eine einzelne Struct-Instanz konvertieren?

wie man ein Objekt, das einem zerstörten Objekt zugeordnet ist, aus dem Gedächtnis holt

Wie erstelle und verwende ich ein Python-Objekt, das als C ++ - Objekt gespeichert ist?

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv