On 18.05.2011 09:21, Martin Dias wrote:


On Tue, May 17, 2011 at 7:16 PM, Igor Stasenko <[email protected] <mailto:[email protected]>> wrote:

    On 17 May 2011 22:58, Mariano Martinez Peck <[email protected]
    <mailto:[email protected]>> wrote:
    >
    >
    > On Tue, May 17, 2011 at 10:31 PM, Sven Van Caekenberghe
    <[email protected] <mailto:[email protected]>>
    > wrote:
    >>
    >> On 17 May 2011, at 21:57, Mariano Martinez Peck wrote:
    >>
    >> > Sven, I want to make it work :)
    >> >
    >> > so....the missing methods I told you that I need are:
    >> >
    >> > #nextStringPut:
    >> > #nextNumber:put:
    >> > #nextInt32Put:
    >> > #nextWordPut:
    >>
    >> I guess these are pretty easy. But I think they clutter the
    interface of
    >> ZnBufferedWriteStream, so maybe you should make a subclass.
    >>
    >
    > Yeah, don't worry. I can even duplicate the class hehehe
    >
    >>
    >> > #contents
    >> >
    >> > Implement #contents I guess it is something like:
    >> >
    >> > ZnBufferedWriteStream >> contents
    >> > ^ stream contents
    >>
    >> Why to you need #contents ?
    >
    > becasue I am an idiot. No, I don't need it. You are correct.
    Thanks for
    > asking.
    >
    >>
    >> I would say that it goes a bit against the concept of a stream
    as a sink
    >> of data.
    >> I haven't looked, but I would guess that saying #contents to a
    FileStream
    >> is not efficient.
    >>
    >> > Those missing methods I need are implemented
    PositionableStream. I took
    >> > the implementation from there and  put it in
    ZnBufferedWriteStream.
    >> > I just added to them a first line "    self flushBufferIfFull."
    >>
    >> That is probably OK, except when your string becomes larger
    than the
    >> buffer. Have a look at #nextPutAll:
    >>
    >
    > I am not sure if I understood. The following are correct for
    sure then:
    >  #nextNumber:put:
    >  #nextInt32Put:
    >  #nextWordPut:
    >
    >
    > And #nextStringPut:   is like this:
    >
    > nextStringPut: s
    >     "Append the string, s, to the receiver.  Only used by
    DataStream.  Max
    > size of 64*256*256*256."
    >
    >     | length |
    >     self flushBufferIfFull.
    >     (length := s size) < 192
    >         ifTrue: [self nextPut: length]
    >         ifFalse:
    >             [self nextPut: (length digitAt: 4)+192.
    >             self nextPut: (length digitAt: 3).
    >             self nextPut: (length digitAt: 2).
    >             self nextPut: (length digitAt: 1)].
    >     self nextPutAll: s asByteArray.
    >     ^s
    >

    Sorry, but i can't resist commenting on that.
    Why, if you demand from stream to implement #nextInt32Put:
    a the same time, you writing code like this

    self nextPut: (length digitAt: 4)+192.
                self nextPut: (length digitAt: 3).
                self nextPut: (length digitAt: 2).
                self nextPut: (length digitAt: 1)

    ?
    Then just extend your serializer with a notion of 'length' field,
    which you can use for anything where you need to encode
    length/size value,
    but not just for Strings.
    So, then the above method could be as short as:

    nextStringPut: s
     self putLength: s size.
     self nexPutAll: s asByteArray.

    and here you have a potential caveat because your string could be
    WideString .. muhahaha.

    So, i suggest you to reconsider the way how you serializing strings.
    Instead what you could do is to extend ByteString and WideString (and
    perhaps similarily do for ByteSymbol and WideSymbol),
    the methods which is responsible to turning a receiver in a sequence
    of bytes, and then simply put it into output stream,
    whatever it might be.

    Then you don't need #nextStringPut: because its
    a) not polymorphic, because apparently serializing ByteString should
    be different from serializing WideString
    b) instead you implementing this in
    Byte/WideString>>serializeToFuelStream: aStream and you done.


Yes, I am not sure if #nextStringPut: is not polymorphic, but I think that with #serializeToFuelStream: we can avoid converting the WideString to ByteArray just to write the ByteArray to the stream, and instead just write the WideString to the stream. Right?
You don't ever need the asByteArray call to store ByteStrings if you use nextPutAll: on a default stream in binary mode, the primitive handles that just fine for variableByte subclasses.

If you are doing the same as DataStream, only ByteStrings are written using nextStringPut: , WideStrings are stored with the default writeWordLike: facilities.

Is there a document describing the binary format of Fuel somewhere?

Cheers,
Henry

Reply via email to