Project loading in 3.7

Ned Konz ned at squeakland.org
Tue Nov 9 16:09:19 UTC 2004


On Tuesday 09 November 2004 2:16 am, goran.krampe at bluefish.se wrote:
> While on the subject so to speak - I am currently migrating an app from
> 3.6 to 3.7 that uses ImageSegments for domain model storage. It then
> appeared to me that ImageSegments saved from 3.6 and loaded into 3.7 get
> broken Date instances. This is of course not surprising, given the
> change in representation of Dates.
>
> Now... the questions:
>
> 1. Should we care to make this work? Is it meant to work? I assume
> Squeaklanders might want it to work, though they don't use Dates much
> perhaps in their projects.

Yes, it should work. The conversion code for SmartRefStream is also called for 
objects in ImageSegments, because the outPointers array is serialized.

> 2. How can I fix it? Is there some place to hook in conversion code? I
> can of course sniff around but perhaps someone can give me a quick hint.

It is (or should be, anyway) the responsibility of people making changes to 
classes in the base image which might be in an ImageSegment (which would 
certainly include Dates) to make conversion methods.

You may need to provide one or more methods to fix this:

- convertToCurrentVersion: varDict refStream: smartRefStrm

is passed varDict, which is a Dictionary of the instVars by name. This is the 
probable method that you'll want to provide. This is called if the number of 
instance variables (and/or name? not sure) has changed since the object was 
stored.

- classVersion (a class side method), whose comment says:
 "Default.  Any class may return a later version to inform readers that use 
ReferenceStream.  8/17/96 tk"
 "This method allows you to distinguish between class versions when the shape 
of the class 
 hasn't changed (when there's no change in the instVar names).
 In the conversion methods you usually can tell by the inst var names 
 what old version you have. In a few cases, though, the same inst var 
 names were kept but their interpretation changed (like in the layoutFrame).
 By changing the class version when you keep the same instVars you can 
 warn older and newer images that they have to convert."
 ^ 0

- comeFullyUpOnReload: smartRefStream

called after loading an object from a DataStream. Can return a different 
object (this is used, for instance, by DiskProxy instances). Can also do 
special things like hooking up the loaded object to other things that may not 
have been serialized.

And, for the other direction (for providing backwards compatibility, if that's 
important), there's 

- objectForDataStream: aStream

but don't try returning anything but self or a DiskProxy, because I don't 
think that works. Still, if you'd like to (for instance) nil out caches, or 
store some instVars differently this can be a place to do it.

and also:

- prepareToBeSaved (Morph only)

which is called on Morphs being saved, and is a handy place to clean stuff up.

-- 
Ned Konz
http://bike-nomad.com/squeak/



More information about the Squeak-dev mailing list