Smalltalk ReferenceStream在使用新的实例变量时存在问题



在Pharo Smalltalk中,我使用ReferenceStream来序列化一个对象列表——下面是我正在序列化的对象的类定义:

Object subclass: #Task
instanceVariableNames: 'title notes list project dateNextAction dateCreated dateCompleted importance selected'
classVariableNames: 'Database'
poolDictionaries: ''
category: 'ToDo'

我使用这里描述的SMFileDatabase方法:http://book.seaside.st/book/advanced/persistency/image-based-persistency

这一直工作得很好,我的原型应用程序不需要使用数据库。

然而,这里的问题是:当我添加一个新的实例变量personTask的负载从ReferenceStream中断:

Object subclass: #Task
instanceVariableNames: 'title notes list project person dateNextAction dateCreated dateCompleted importance selected'
classVariableNames: 'Database'
poolDictionaries: ''
category: 'ToDo'

它似乎没有发现新的变量,并将值加载到错误的槽中,所以人取dateNextAction的值,dateNextActiondateCreated,等等。

我怎样才能阻止这种情况的发生?

通过将新变量放在列表的末尾,我已经使它工作了,但是我想按类型对变量进行分组。

ReferenceStream不再被支持,在Pharo 2.0中已被删除。你应该使用Fuel,它写得很好,有很好的文档,经过很好的测试,而且非常快。http://rmod.lille.inria.fr/web/pier/software/Fuel

SmartRefStream应该能帮到你。从文档中引用:

普通的ReferenceStreams假定在写入和读取对象文件时实例变量的名称和顺序完全相同。
SmartRefStream允许在实例变量改变或整个类被重命名后读取对象文件。

想要完成书中的示例的人,请遵循以下步骤:

1。回到时间并从https://gforge.inria.fr/frs/?group_id=1299

获取Pharo 1.4

向下滚动并查找one - click Pharo 1.4并获得最新版本,如果有更新的版本:https://gforge.inria.fr/frs/download.php/file/31359/Pharo-1.4-14457-OneClick.zip

使用配置浏览器来安装Seaside,你就完成了。

1。或者使用在Pharo 1.3上运行的传统开发预构建的Seaside, Scriptaculous, Magritte, Pier映像:http://www.seaside.st/distributions/Seaside-3.0.7-final.zip

我很幸运地从这里使用了一个Pharo VM: http://files.pharo.org/vm/pharo/20/mac/stable.zip

2。通过Monticello从当前图像的中取出代码,然后"返回"到旧图像中。成功!

p。更多细节在这里:FileDirectory和ReferenceStream类在Pharo?

最新更新