Am 28.11.17 um 13:52 schrieb Mariano Martinez Peck:
> On Tue, Nov 28, 2017 at 9:31 AM, Andreas Brodbeck <da...@mindclue.ch> wrote:
> 
>> Am 28.11.17 um 12:46 schrieb Mariano Martinez Peck:
>>> Hi Andreas,
>>>
>>> Do you know why method contexts are trying to be serialized? Of course,
>>> probably because of closures.  Do you think / know / are aware of
>> closures
>>> as part of your graph? Maybe Sorted Collection?
>>> I am asking because if the only thing is SortedCollection then we can use
>>> some hook...
>>
>> I have closures in several places in the object graph. These are objects
>> with some pluggable functionality, which I rely on.
>>
> 
> 
> *OK. The question is then if those closures are "clean" or not.* In other
> words, what's their scope? Do they refer to variables defined outside  the
> closure (in which case you would need the methods contexts / stack) or are
> they clean in the sense that you could be able to replace them via a string
> and then compile them again ?
> Some time ago we added a #isClean to BlockClosure. You can test a few of
> your closures to see if this is the case or not.
> 
> Btw, I have an application for a client in which we also have closures to
> define some pluggable behavior. But what I do is:
> 
> 1) guarantee they are 100% clean (does not go outside of scope)
> 2) aside from the "block" instVar I also add another instVar which is the
> "string" version of it. Then I always implement
> #fuelIgnoredInstanceVariableNames to ignore all those "block" instVars, yet
> DO NOT ignore the "string" like of those closures. Then, of course, the
> getter of the block instvar does a lazy compilation if the block instVar is
> nil...
> 
> I know you already have your application written, but I am trying to
> explain how I was able to use Fuel for this case...

Just for the record, here is the solution what I ended up with:

--- Install Fuel version 1.9.4 for debugging:

(ConfigurationOfFuel project version: '1.9.4')
        load: #(default FuelDebug FuelPreview).

--- Analyze the fuel serialization of the root object myDatabaseObject
in the Pharo 1.4 image:

FileStream forceNewFileNamed: 'debug.fuel' do: [:aFile |
        FLSerializer newDefault
                setDebug;
                serialize: myDatabaseObject on: aFile binary].

FLDebugSerialization last log inspect.


--- In the inspected Fuel-Log, look for the FLCompiledMethodCluster,
which told me in which classes I use BlockClosures which fuel wants to
persist.

--- Changed my source code and the live objects where I use persisted
BlockClosures to only use "clean" BlockClosure and only fuel-store them
as Strings (Using fuelIgnoredInstanceVariableNames) an recompile them
when the instance is materialized (Using fuelAfterMaterialization), as
suggested by Mariano.

--- Searched for some few usages of SortedCollection and made sure, that
there is no sortBlock but only the default sort behaviour.


So finally I got rid of persisted BlockClosures in the fuel file. That
1.9.4 Fuel file stored with Pharo 1.4 could then be materialized in
Pharo 6.1. with the same Fuel version 1.9.4 without problems! I'm happy.


Cheers,
Andreas



-- 
Andreas Brodbeck
www.mindclue.ch


Reply via email to