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