2017-09-27 2 views
2

Nach this question;Wie das Deserialisieren von Objekten mit zwei Referenzen?

Bitte geben Sie ein kurzes Beispiel, wie man ein Objekt mit zwei Referenzen deserialisieren würde.

Ich habe den folgenden Code enthalten, so dass sich alle Antworten auf die gleichen Objektnamen beziehen.

public class Person implements Serializable{ 
    private String name; 
    private int age; 
    private boolean single; 
    private int numKids; 
    private final static long serialVersionUID = 1L; 

    public Person(String name, int age, boolean single, int numKids) { 
     this.name = name; 
     this.age = age; 
     this.single = single; 
     this.numKids = numKids; 
     this.surname = surname; 
    } 
} 

Unter der Annahme, die folgenden:

  1. Eine Textdatei bereits erstellt wurde
  2. Wir haben ein Objekt Person erstellt jim
  3. Es gibt eine andere Person bob, die das jim Objekt verweist

Die qu Die bereits erwähnte Referenz beschreibt, wie nur jim in die Datei geschrieben wird. Die bob Referenz ist nicht. Wie lesen wir dann die Werte zu jim und bob, wenn die Datei noch einige wenige Objekte der Klasse Person enthalten könnte? Wie können wir sicherstellen, dass bob den richtigen Wert hat?

+1

Sie müssen eine Sammlung von Person verwenden und sie serialisieren. –

Antwort

2

Sie scheinen ein wenig verwirrt zu sein. Ihre Person Klasse tut nicht erlauben für Referenzierenein anderes Person Objekt. Sie würden ein Person Feld innerhalb der Person Klasse benötigen, um dorthin zu gelangen! Aus dieser Perspektive macht Ihre Frage keinen Sinn: jim und bob wären zwei völlig unabhängige Objekte, und Serialisierung einer von ihnen wird die andere überhaupt nicht serialisieren!

Aber darüber hinaus: in der Regel, wenn Sie denken, in Plurale der Dinge (wie mehrere Personen), dann würden Sie eine umschließende „Container“ zum Gegenstand haben (wie ein List<Person>), die Sie denken. Sie beschäftigen sich dann nicht mit einzelnen Person-Objekten - sondern mit solchen Containern, wenn Sie über die Serialisierung nachdenken!

Sie versuchen, ein künstliches Beispiel zu erstellen, das einfach nicht funktioniert. Denken Sie eher an eine Situation, in der die Klasse Person vielleicht ein Feld Person spouse hat. Dann könnte alice durch bob referenziert werden. Und wenn Sie nun diese Personenobjekte und einige mehr in einer Liste haben und diese Liste serialisieren, stellt das System sicher, dass alice und bob nur einmal serialisiert werden.

0

Ich bin etwas verwirrt Ihre Frage - vielleicht, weil ich kein Problem mit der Serialisierung und Deserialisierung des gleichen Objekts und/oder mehrerer Objekte mit oder ohne Verweise auf irgendwelche Objekte sehen.

Der Punkt ist, dass Serialisierung ist wie Erstellen von Kopie des Objekts (im Dateisystem oder irgendwo). Diese Kopie kann im Speicher neu erstellt werden (Deserialisierung). Sie können ein Objekt im Speicher (Deserialisierung) ein- oder mehrmals erstellen.

es so etwas wie:

object A --serialization--> file A 
file A --deserialization--> object A' 
file A --deserialization--> object A" 

Objekt A, A‘und A“ sind verschiedene Objekte - aber alle Felder werden die gleichen Werte haben.

Wenn Objekt A eine ausgeklügelte Struktur enthält (die serialisiert/deserialisiert werden kann), kann es auch andere Objekte geben, dann funktionieren dieselben Mechanismen auch für diese Objekte.

Alle Felder haben die gleichen Werte, aber das Objekt wird anders sein.

siehe Beispielcode:

package test; 

import java.io.Serializable; 

public class Person implements Serializable { 
    int id; 
    String name; 

    public Person(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 
} 

und Art Test

package test; 

import java.io.*; 

public class Main { 
    public static void main(String... args) { 
     Person p1 = new Person(1, "aaa"); 
     Person p1a = null; 
     Person p1b = null; 
     try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.data"))) { 
      oos.writeObject(p1); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try (ObjectInputStream oos = new ObjectInputStream(new FileInputStream("test.data"))) { 
      p1a = (Person) oos.readObject(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

     try (ObjectInputStream oos = new ObjectInputStream(new FileInputStream("test.data"))) { 
      p1b = (Person) oos.readObject(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

     assert p1a != null && p1b != null; 
     assert p1a.id == p1b.id; 
     assert p1.id == p1b.id; 
     assert p1.name.equals(p1a.name); 
     assert p1a.name.equals(p1b.name); 

     System.out.println(String.format("Three different object: %s, %s, %s", p1, p1a, p1b)); 


    } 
} 

PS. Wie java.lang.String Objekte kopiert/gespeichert/verwaltet werden, ist es eine andere Geschichte.

Verwandte Themen