2013-10-16 60 views
3

我現在已經運行第三次到這個問題,你們中的一些佳樂程序員可能會認識最好從截圖:佳樂字面限制

enter image description here

下面是例子代碼來重現問題:

d:=Dictionary new. 
(1 to: 257) do: [:each| 
    d at: each put: each 
]. 
f:=FileStream fileNamed: 'asdf.txt'. 
d storeOn: f. 
f reset. 
d2:=Dictionary readFrom: f. 
f close. 

我知道爲什麼它發生(編譯器用於反序列化,它通過將整個文件的方法,這樣做)。

在過去,我總是將我的代碼更改爲使用數據庫或使用其他形式的序列化。 但我想知道是否有某種方法來解決吱吱作出這項工作,而不是

+0

您是否嘗試過「塊格式」,將輸入分成幾個塊?每個_should_有256個文字可用。 – Tobias

+0

@Tobias我可能會接受你的回答,只是關於塊格式的一個問題:如果它是一個大的(嵌套的)被序列化的對象(就像上面的Dict),或者只有有多個對象可以一個接一個地讀? –

+0

我認爲你應該使用單獨的obects。在文件輸入過程中,每個塊都由編譯器單獨評估;你可能甚至想(暫時)創建一個Global來保存你的數據。 – Tobias

回答

6

目前,沒有適當的方法。

問題是,那個CompiledMethods有一個VM已知的格式,並且該VM預期的也是。這包括256個文字限制。 對方法格式的更改需要對虛擬機進行更改。這就是爲什麼人們猶豫直到現在才改變字面限制。

最近,人們花費精力去創造一種新的格式,不僅爲方法而且 完全改變對象格式:the SPUR object format旨在增加方法中的文字數量等等。

4

如圖所示,#storeOn:API不是強化的序列化API。但是如果你打算使用它們(而不是每年進出的序列化項目之一),那麼你可以與「聰明」(這是256個字面限制,這是一個優化的東西)作鬥爭,你自己的「聰明」。

一個訣竅在於,我們可以認爲「嵌套」文字沒有限制。

a := #(1 2 3 4 5 6 7 8 9) 

不包含10個文字。它只包含一個數組本身。它可以擁有儘可能多的文字。因此,利用一點點額外的Dictionary的魔力,我們可以改變你的例子是:

d := Dictionary new. 
(1 to: 257) do: [:each | d at: each put: each]. 
f := FileStream fileNamed: 'asdf.txt'. 
pairs := d associations collect: [:kv | Array with: kv key with: kv value ]. 
pairs storeOn: f. 
f reset. 
d2 := Dictionary newFromPairs: (Array readFrom: f). 
f close. 
d2 

基本上我們卻在把你的字典成一個數組的數組。所以這只是你要存儲的一個文字。然後我們使用方便的newFromPairs:,它恰好採取了......鼓卷...陣列陣列。

+0

+1,但是如果字典不是單層的東西,而是字典的樹,或者是收集的集合,那麼這可能太難了。 –