4

在 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

这一直运行良好,并且不必为我的原型应用程序使用数据库真是太好了。

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

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

它似乎没有发现新变量,并将值加载到错误的插槽中,所以 person 取值dateNextActiondateNextAction取值dateCreated等等。

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

我通过将新变量放在列表末尾来使其工作,但我想按类型对变量进行分组。

4

3 回答 3

6

ReferenceStream 不再受支持,在 Pharo 2.0 中已被删除。您应该使用编写良好、文档完善、测试良好且速度非常快的 Fuel。http://rmod.lille.inria.fr/web/pier/software/Fuel

于 2013-04-01T10:58:58.977 回答
6

SmartRefStream应该可以帮助你。从文档中引用:

普通的 ReferenceStreams 假设实例变量的名称和顺序在写入和读取目标文件时完全相同。
即使在实例变量已更改或整个类已重命名后,SmartRefStream 也允许读取对象文件。

于 2013-04-01T12:04:37.183 回答
0

那些想要完成书中示例的人,请按照以下步骤操作:

1. 回到过去并从以下网址获取 Pharo 1.4:https ://gforge.inria.fr/frs/?group_id=1299

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

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

1a。或使用在 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 将您的代码从当前图像中取出,然后“返回”到旧图像中。成功!

PS。更多详细信息: Pharo 中的 FileDirectory 和 ReferenceStream 类等价物?

于 2015-02-04T18:49:37.213 回答