2012-03-16 97 views
2

我目前在學習Java中的對象序列化,並且在我的理解中甚至可以序列化一個實現了Serializable接口的對象,並將它通過一個套接字傳遞給另一個程序。對象序列化查詢

class Mammal implements Serializable 
{ 
    int legs = 4; 

} 

public class ObjectSerial 
{ 



    public static void main(String[] args) 
    { 
     try 
     { 
      FileOutputStream fo = new FileOutputStream("mammal.obj"); 
      ObjectOutputStream oo = new ObjectOutputStream(fo); 

      Mammal m = new Mammal(); 
      oo.writeObject(m); 
      oo.close(); 
     } 
     catch(IOException e){} 

     //read object 
     try 
     { 
      FileInputStream fi = new FileInputStream("mammal.obj"); 
      ObjectInputStream oo = new ObjectInputStream(fi); 

      Mammal m = (Mammal)oo.readObject(); 
      System.out.println(m.legs); 
     } 
     catch(IOException e){} 
     catch(ClassNotFoundException cnf){}//this exception must also be caught 
    } 
} 

令我百思不解的是,當我想檢索例如服務器端類的成員,我將如何「覆蓋面;序列化對象。

try 
    { 
     FileInputStream fi = new FileInputStream("mammal.obj"); 
     ObjectInputStream oo = new ObjectInputStream(fi); 

     Mammal m = (Mammal)oo.readObject(); 
     System.out.println(m.legs); 
    } 
    catch(IOException e){} 
    catch(ClassNotFoundException cnf){}//t 

換句話說。在另一個程序中,編譯器會告訴我該符號無法找到。

希望這個問題聽起來不是很無知。 只是爲了確認......我如何在不同的程序中訪問Serializedobject的變量。

問候

回答

3

當你在服務器上反序列化你的「mammal.obj」,你需要有Mammal.class類路徑上。 Mammal也依賴於類路徑。這是唯一的方法,也是序列化的一個缺點。它以二進制方式將您的客戶端和服務器連接起來。

1

而且,不要忘了補充一點:

// Better to let the compiler generate this at first 
private static final long serialVersionUID = -1111111L; 

,並確保其得到改變每次更改對象數據定義時間(即,添加/刪除/修改非瞬態字段定義) 。

寫入序列化對象時,serialVersionUID是寫入內容的一部分。當它重新讀入時,它將使用serialVersionUID並將其與ClassLoader中該類的serialVersionUID進行比較。

如果兩者不匹配,則意味着序列化對象是從與當前加載的類不同的版本生成的,並且會引發異常。