2017-09-27 50 views
2

繼續從this question;如何使用兩個引用對對象進行反序列化?

請給出一個簡短的例子,說明如何用兩個引用反序列化一個對象。

我已經包含下面的代碼,所以所有的答案引用相同的對象名稱。

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; 
    } 
} 

假設如下:

  1. 一個文本文件,已創建
  2. 我們創建了一個Person對象jim
  3. 還有另外一個人鮑勃引用jim對象

該曲已經引用的estion描述瞭如何將jim寫入文件。 bob參考不是。那麼如果文件可能包含Person類的其他幾個對象,那麼我們如何讀取jimbob的值?我們如何確保bob具有正確的值?

+1

您必須使用Person的集合並對其進行序列化。 –

回答

2

你似乎有點困惑。您的人員類別不是允許參考另一個人員對象。您需要在Person類中的Person字段才能達到此目的!從這個角度來看,你的問題沒有意義:jimbob將是兩個完全獨立的對象,並且序列化其中的一個根本不會串行化另一個對象!

但除此之外:通常情況下,當你覺得在複數的東西(如多個人的),那麼你將有一個封閉的「容器」的對象(如List<Person>),你想想。你不需要處理單個Person對象 - 但是在考慮序列化時使用這些容器!

您正試圖構建一個根本無法解決的仿真示例。相反,想一想Person類可能有一個字段Person spouse的情況。然後alice可以被bob參考。當你現在有這些Person對象,還有更多的在列表中,並且你序列化了這個列表 - 那麼系統將確保alicebob只被序列化一次。

0

我有點困惑你的問題 - 也許是因爲我沒有看到任何問題與相同的對象和/或多個對象的序列化和反序列化,有或沒有任何對象的引用。

重點是序列化就像創建對象的副本(在文件系統或某處)。這個副本可以在內存中重新創建(反序列化)。 您可以在內存中創建對象(反序列化)一次或多次。

它是這樣的:

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

對象A,A」和A」是不同的對象 - 但所有字段將擁有相同的價值觀。

如果對象A包含一個複雜的結構(可以序列化/反序列化),它也可以是另一個對象,那麼同樣的機制也可以用於這些對象。

所有字段將具有相同的值,但對象將不同。

看的示例代碼:

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; 
    } 
} 

和一種測試

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的。 java.lang.String如何在內存中複製/存儲/管理對象,這是不同的故事。

相關問題