2010-06-29 76 views
2

我有一個複雜的對象,帶有字段和引用數據庫,我想作爲序列化對象傳遞。我實現了該接口,但另一方面它不能解決問題,並且出現意想不到的錯誤。如何自定義複雜對象的序列化?

我想做的是在序列化之前告訴我只有序列化的ID,並且在反序列化之後找回ID並且更容易地重建項目。

爲了幫助一個代碼,我有

setId(); 
getId(); 
and Load() methods 

我想通過對象內部完成。

這怎麼辦?

回答

4

是沒有意義的serialize數據庫國土資源所以你要設置你的非序列化字段作爲transient然後在readObject方法解決這些問題。例如: -

private int id; 
private transient java.sql.Connection connection; 

private void readObject(ObjectOutputStream out) throws IOException { 
    out.defaultReadObject(); 
    connection = DriverManager.getConnection(); 
} 

這裏的id字段將在defaultReadObject()反序列化,但如果你想有一個數據庫資源,你將不得不管理的是自己作爲像這樣的瞬時數據不能JVM之間轉移。

+0

請問你是否願意幫我解決一些問題。這是我做序列化的第一個任務。 – Pentium10 2010-06-29 09:18:26

+0

只需看一下'Serializable'的JavaDoc。 – musiKk 2010-06-29 09:20:09

+0

另一個問題。我有一個3級繼承,abstract-> first imp-> second implementation。第二個是僅可序列化的,但數據庫是抽象定義的。我是否必須在抽象和一級實施中將所有字段標記爲暫時的? – Pentium10 2010-06-29 09:21:22

2

看看有關Java(Joshua Bloch)討論序列化的項目54,55,56和57。總結

  1. 直到你絕對必須使用它。
  2. 爲您的班級安裝serialVersionUID。 (請不要把它作爲1)
  3. 提供的readObject,仔細的writeObject
  4. 不要忘記調用defaultReadObject和defaultWriteObject在上述兩個
  5. 馬克各個領域不可序列瞬態
  6. 馬克所有領域瞬態,可以與其他領域構建
  7. 考慮使用自定義序列化表單(項目55有效的Java),如果你有鏈接列表等
  8. 小心,如果你是一個單身人士。提供一個readResolve方法

最後,仔細閱讀javadoc的Serializable和Effective Java的54-57項。它也會回答你的其他問題。

乾杯