2012-11-11 166 views
2

我明白序列化是保存對象實例的一種快速方法,包括對象內的所有變量,不包括靜態引用以及用transient關鍵字標記的變量。在Java中使用序列化的最佳方法是什麼?

我不是很好的I/O和我的應用程序有大約50班,其中有三個明顯的不同對象(包含在其中的對象)。

例如,我有一個動物類Employee類車輛類別。所有這一切都包含實例對象,在運行時,它包含自己的子類,方法等

我的問題是,什麼是節約系列化所有這些信息的最簡單的方法?我已經和我的教授討論過這個問題,他提出了一個類似於包含類「Data.class」的東西,它在所有內容中都有「手」,然後對其進行序列化。哪一個最終會保存它引用到.ser文件的每個對象。

我想過使得「Data.class」,然後讓我的所有50個班,延長數據。 然後有我的保存方法做這樣的事情

public void saveData(){ 
     Data myData = new Data() 
try 
     { 
     FileOutputStream fileOut = 
     new FileOutputStream("Data.ser"); 
     ObjectOutputStream out = 
          new ObjectOutputStream(fileOut); 
     out.writeObject(myData); 
     out.close(); 
      fileOut.close(); 
     }catch(IOException i) 
     { 
      i.printStackTrace(); 
     } 
} 

不過,我似乎無法得到這個工作。我相信這是因爲我正在創建一個Data的空白實例,其中只包含所有子類的默認值。當我打算保存時(在相應對象中的所有值都被填充之後),我正在調用該函數,但是我做了錯誤的事情,無法弄清楚什麼。

任何幫助將不勝感激。當然,我不必手動序列化三種不同類型對象的每一個實例?它已經超過了300,我不想這樣做。

此外,我給數據一個serialVersionID並實現數據的可序列化接口。

回答

4

確保所有的類實現Serializable接口,這Data類有方法的序列化/反序列化AnimalEmployeeVehicle和其他類。

您可以通過單一方法saveData(Serializable serializable, String fileName)輕鬆完成此操作。這將是您的需求(基於您的實際代碼)的骨架:

public class Data { 

    public void saveData(Serializable serializable, String fileName) { 
     try { 
      FileOutputStream fileOut = new FileOutputStream(fileName); 
      ObjectOutputStream out = new ObjectOutputStream(fileOut); 
      out.writeObject(myData); 
      out.close(); 
      fileOut.close(); 
     } catch(IOException i) { 
      i.printStackTrace(); 
     } 
    } 
} 
+0

'數據myData的=新的數據();'應中省略,而串行化'serializable' ...;) – Mordechai

+0

或序列化'this'爲數據對象本身。 – Mordechai

+0

@ M.M。真的,我在晚上回答了這個問題,所以我沒有考慮。謝謝 –

0

標記您不希望序列化爲瞬態或靜態的任何變量。如果您需要更多信息或好奇,請看here

+1

不要讓它們成爲靜態的,這樣它們就不會被序列化。靜態會導致變量與類相關聯,而不是該類的單個實例,這可能會損害預期的行爲。只要使用瞬態,如果它們不是靜態的。 – ApproachingDarknessFish

相關問題