Discussion:
[心得] 序列化的小細節
(时间太久无法回复)
foolish
2006-10-26 13:09:32 UTC
Permalink
1.程式邏輯可能出大紕漏。
假設A1和A2都參考到B1,而我經由A1取得B1,
而修改了B1的內容。但事實上A2參考的是B2,
只不過B1.equals(B2) == true。但我修改B1以後
B1.equals(B2) == false。這不是我想見到的結果。
我想要的是A1和A2都「確實」參考到B1,那我只要
修改B1即可,大家都Happy。
2.記憶體佔用會變多。
簡單來說就是浪費,佔用比原先還多的記憶體,
檔案也會一起變大。A1和A2原先都參考到B1,
若產生了副本B2,那記憶體就要多佔用B2的空間。
更不用說A可能從1到很大,B也可能從1到很大。
重複的部分會有多少乘上多少呢?
最可怕的還是B2.equals(B1) == true,這樣我要
B2存在記憶體作啥呢?同樣也不是我想見到的結果。
被serialization的物件關聯,要同時間被寫入。讀出來亦然。

您分了二次讀取給二個變數,只要您單一次讀取檔a.object

或b.ojbect。答案各別都會一樣的。

只是您"碰巧寫在二個檔",又"碰巧以為要二個檔個別讀取"

不管你寫入幾次,分開來用都應該要是對的

(不然就不能用serialization做cluster了XD)
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: 163.26.34.20
foolish
2006-10-26 13:18:34 UTC
Permalink
ObjectInputStream ois = new ObjectInputStream(fis);
A a = (A)ois.readObject();
fis = new FileInputStream("b.object");
ois = new ObjectInputStream(fis);
B b = (B)ois.readObject();
在我們交談的內容中,我提到了你要選擇"樹的根節點"為起點去做存取的動作。

亦如NTUtzboy所提的javadoc內容,所有有關聯到的都會存入。

您的例子正巧是交互關聯。因此覺得由那存都是沒差的。

而"樹的根節點"只是代表一種互相串聯資料的源頭罷了,

也許你覺得沒有所謂的根節點存在,但畫一個圓總要有一個起點的。

由那開始就要請您決定。


另外,我們也可以參考別人的實例

Loading Image...

這是wicket IModel的UML圖,他在實面的最頂層實作了serialiable

並且他擁有內圈含的Nested IModel,還有反向節點。

即使如此複雜的結構。仍只要抓住他需要的那一層IModel去做

序列化的起點,取用也是由這起點去取出來。
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: 163.26.34.20
foolish
2006-10-26 13:21:56 UTC
Permalink
1.程式邏輯可能出大紕漏。
假設A1和A2都參考到B1,而我經由A1取得B1,
而修改了B1的內容。但事實上A2參考的是B2,
只不過B1.equals(B2) == true。但我修改B1以後
B1.equals(B2) == false。這不是我想見到的結果。
我想要的是A1和A2都「確實」參考到B1,那我只要
修改B1即可,大家都Happy。
另一個想法,

如果B僅是負責被人參考的值。

也許能獨立出來變成lookupable介面

另外放在hashtable,而key為A的示識號

讓此hashtable有自己的serialization file

需要時再做lookup的動作即可
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: 163.26.34.20
◆ Modify: 06/10/26 21:21:56 <163.26.34.20> 
继续阅读narkive:
Loading...