On Fri, Feb 10, 2012 at 2:45 PM, Yanni Chiu <yanni@rogers.com> wrote:
On 10/02/12 10:24 AM, Martin Dias wrote:
Maybe is too much overhead, but it is also possible to serialize an
object that represents the metadata as a prefix:

FileStream forceNewFileNamed: 'demoMetadata.fuel' do: [:aStream |
aStream binary.
metadata := Dictionary with: #meta -> 5.
content := 'stuff'.
FLSerializer newDefault
serialize: metadata on: aStream;
serialize: content on: aStream ].

FileStream oldFileNamed: 'demoMetadata.fuel' do: [:aStream |
| aMaterializer |
aStream binary.
aMaterializer := FLMaterializer newDefault.
metadata := (aMaterializer materializeFrom: aStream) root.
content := (aMaterializer materializeFrom: aStream) root ].

I like this solution best, since it doesn't change the Fuel "file format".

I added some helper methods to my code base to make this usage scenario more obvious:

FLMaterializer>>nextMaterializedRootFrom: sourceStream
� � � �^ (self materializeFrom: sourceStream) root

FLMaterializer>>allMaterializedRootsFrom: sourceStream
� � � �| contents |
� � � �contents := OrderedCollection new.
� � � �[ sourceStream atEnd ]
� � � � � � � �whileFalse: [ contents add: (self nextMaterializedRootFrom: sourceStream) ].
� � � �^ contents


Sample usage:


FileStream forceNewFileNamed: 'demoMetadata.fuel' do: [:aStream |
| serializer |
aStream binary.
serializer := FLSerializer newDefault.
(1 to: 5) do: [ :each | serializer serialize: (Dictionary with: each -> (each * each)) on: aStream ].

].

FileStream oldFileNamed: 'demoMetadata.fuel' do: [:aStream |
| aMaterializer |
aStream binary.
aMaterializer := FLMaterializer newDefault.
aMaterializer allMaterializedRootsFrom: aStream ].



FileStream oldFileNamed: 'demoMetadata.fuel' do: [:aStream |
| aMaterializer |
aStream binary.
aMaterializer := FLMaterializer newDefault.
aMaterializer nextMaterializedRootFrom: aStream.
aMaterializer nextMaterializedRootFrom: aStream.
].

Great. Maybe we should include #nextMaterializedRootFrom: to fuel.

Based on metadata you might decide to not materialize the "real" content. Like:

metadata := (aMaterializer nextMaterializedRootFrom: aStream).
[ metadata isWhatINeed ] ifTrue: [�
� � realContent :=�aMaterializer nextMaterializedRootFrom: aStream�].