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.
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.
Sehen Sie sich das folgende Diagramm an, um das obige Konzept in Ihrem Kontext darzustellen:
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:
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:
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.
Lass mich ein paar Worte sagen