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
|