我现在第三次遇到这个问题,有些人吱吱作响者可能会从屏幕截图中认出来最好:
以下是重现问题的示例代码:
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.
我知道为什么它会发生(编译器用于反序列化,它通过将整个文件放在一个方法中来实现)。
在过去,我总是将我的代码更改为使用数据库或使用其他形式的序列化。 但我想知道是否有某种方法可以修复Squeak以使其工作。
答案 0 :(得分:6)
目前,没有正确的方法。
问题是,CompiledMethod
具有VM已知的格式,以及VM的预期。这包括256个文字限制。
对方法格式的更改需要更改虚拟机。这就是为什么人们犹豫是否要改变字面上的限制直到现在。
最近,人们花费精力创造了一种不仅用于方法的新格式 完全改变Object格式:the SPUR object format旨在增加方法中的文字数量等。
答案 1 :(得分:4)
如图所示,#storeOn:API不是强化的序列化API。但是如果你打算使用它们(而不是每年左右出现的一个序列化项目),你可以打“聪明”(这是256字面的限制,它是一个优化的东西),有些你自己的“聪明”。
一个诀窍是利用我们可能认为的“嵌套”文字没有限制。
a := #(1 2 3 4 5 6 7 8 9)
不包含10个文字。它只包含一个,数组本身。它可以根据需要在其中包含尽可能多的文字。因此,我们可以将您的示例改为:{/ p>
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
,这恰好采取了...鼓声......阵列数组。