Smalltalk ReferenceStream has problems with new in

2020-07-18 08:25发布

问题:

In Pharo Smalltalk I'm using ReferenceStream to serialise a list of objects -- here's the class definition of the objects I'm serialising:

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

I'm using the SMFileDatabase method described here: http://book.seaside.st/book/advanced/persistency/image-based-persistency

This has been working well, and it's been nice not to have to use a database for my prototype app.

Howevere, here's the problem: when I add a new instance variable person to Task the load from ReferenceStream breaks:

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

It seems to not spot the new variable, and load the values into the wrong slots, so person takes the value of dateNextAction, dateNextAction takes dateCreated and so on.

How can I stop this happening?

I've got it working by placing the new variable at the end of the list, but I'd like to group variables by type.

回答1:

ReferenceStream is not supported anymore and has been deleted in Pharo 2.0. You should use Fuel which is well written, well documented, well tested and very fast. http://rmod.lille.inria.fr/web/pier/software/Fuel



回答2:

SmartRefStream should help you. To quote from the documentation:

Ordinary ReferenceStreams assume that the names and order of instance variables is exactly the same when an object file is written and read.
SmartRefStream allows object files to be read even after instance variables have changed or the entire class has been renamed.



回答3:

Those wanting to finish the example in the book, follow these steps:

1. Go back in time and get a Pharo 1.4 from: https://gforge.inria.fr/frs/?group_id=1299

Scroll down and look for One-Click Pharo 1.4 and get the latest build, if there is a newer one than: https://gforge.inria.fr/frs/download.php/file/31359/Pharo-1.4-14457-OneClick.zip

Use the Configuration Browser to install Seaside and you're done.

1a. Or use the legacy development prebuilt Seaside, Scriptaculous, Magritte, Pier image running on Pharo 1.3 here: http://www.seaside.st/distributions/Seaside-3.0.7-final.zip

I got lucky using a Pharo VM from here: http://files.pharo.org/vm/pharo/20/mac/stable.zip

2. Get your code out of the current image via Monticello and then "back" into the older image. Success!

PS. More details here: FileDirectory and ReferenceStream Class equivalents in Pharo?