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