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�].
�