public void Marshal(Object o, BinaryWriter ds)
{
int size = 1;
if(o != null)
{
DataStructure c = (DataStructure) o;
byte type = c.GetDataStructureType();
BaseDataStreamMarshaller dsm = GetDataStreamMarshallerForType(type);
if(tightEncodingEnabled)
{
BooleanStream bs = new BooleanStream();
size += dsm.TightMarshal1(this, c, bs);
size += bs.MarshalledSize();
if(!sizePrefixDisabled)
{
ds.Write(size);
}
ds.Write(type);
bs.Marshal(ds);
dsm.TightMarshal2(this, c, ds, bs);
}
else
{
BinaryWriter looseOut = ds;
MemoryStream ms = null;
// If we are prefixing then we need to first write it to memory,
// otherwise we can write direct to the stream.
if(!sizePrefixDisabled)
{
ms = new MemoryStream();
looseOut = new EndianBinaryWriter(ms);
looseOut.Write(size);
}
looseOut.Write(type);
dsm.LooseMarshal(this, c, looseOut);
if(!sizePrefixDisabled)
{
ms.Position = 0;
looseOut.Write((int) ms.Length - 4);
ds.Write(ms.GetBuffer(), 0, (int) ms.Length);
}
}
}
else
{
ds.Write(size);
ds.Write(NULL_TYPE);
}
}