2011-05-10 35 views
2

我需要能夠序列化類爲一個字符串,我知道的2種模式:序列化代理模式解決了序列化模式無法解決的問題?

1)(正常)序列化模式 2)代理系列化格局

我讀過http://lingpipe-blog.com/2009/08/10/serializing-immutable-singletons-serialization-proxy/(中只有網站在谷歌,談論代理序列化模式),仍然不能找到優勢好處使用這種模式。有人能解釋一下代理序列化模式到底是什麼,或者更準確地說,代理序列化模式解決了什麼問題,即正常序列化模式無法解決?

回答

1

默認序列化:

  • 創建應該是在反序列化單例類的多個實例
  • 理應有與即時改變反序列化對象的問題(是嗎?)

二點是有爭議的。誰改變了字節流的數據?如果可能發生,我們有比反序列化更大的問題:安全性。簽名/加密流也可以解決序列化問題。

第一個是真實的。幾次對同一個單例進行序列化,在另一側進行反序列化,並且哎呀!你有多個單身(multitones?)。這個問題雖然是恕我直言,更容易通過從單一的枚舉中解決,然後JVM將強制執行單個實例本身。

UPDATE

正如史蒂夫·乙指出,博客海報也許誤解/歪曲他怎麼看。 「序列化,調整字節,然後反序列化」,而不是「序列化,部署新版本的類,反序列化」。是的,這是已知的問題,Externalizable接口允許通過完全控制類的序列化來整潔地解決它,所以即使後面的版本類也可以反序列化從先前版本創建的流中的自己的數據(如果可能的話完全)。

+1

動態變化對象的問題 - 如果你改變對象簽名(基本上任何可以給你不同結果的東西),你的序列化將與任何以前序列化的對象不兼容。將序列化行爲移到一個單獨的對象中會讓你有些不適應(直到你的代理變得不兼容)。 – 2011-05-10 03:43:29

+0

這是可以理解的。這篇文章雖然說:「問題是你可以序列化一個實例,調整表示數字的字節,然後反序列化。」這不是同一個問題(不是版本不兼容)。 – 2011-05-10 03:47:21

+0

heys我已經更新了我的問題 – Pacerier 2011-05-10 04:35:07