Wednesday, November 24, 2010

SkipObject Bug Solution

Yesterday I blogged about a bug I was having while implementing a serializer for my append only file storage.  I blogged about it here.

The problem with the code is found by gaining a better understanding of how the += operator works:

x += y;

Is equivalent to writing

x = x + y;

The problem in this case can is explained in the following snippet:

public void SkipObject(Stream stream)
{
var reader = new BinaryReader(stream);
// The problem here is that we first get the current position
// from the stream, then we read our int (moving the stream
// forward 4 bytes), then sum the position and the int, but the
// position value we read initially is now out of date so we wind
// up being 4 bytes away from where we expected.
stream.Position = stream.Position + reader.ReadInt32();
}

The fixed version of the function can be seen here:

public void SkipObject(Stream stream)
{
var reader = new BinaryReader(stream);
var objectSize = reader.ReadInt32();
stream.Position += objectSize;
}

No comments:

Post a Comment