public static void MarshalPrimitive(BinaryWriter dataOut, Object value)
{
if(value == null)
{
dataOut.Write(NULL);
}
else if(value is bool)
{
dataOut.Write(BOOLEAN_TYPE);
dataOut.Write((bool) value);
}
else if(value is byte)
{
dataOut.Write(BYTE_TYPE);
dataOut.Write(((byte) value));
}
else if(value is char)
{
dataOut.Write(CHAR_TYPE);
dataOut.Write((char) value);
}
else if(value is short)
{
dataOut.Write(SHORT_TYPE);
dataOut.Write((short) value);
}
else if(value is int)
{
dataOut.Write(INTEGER_TYPE);
dataOut.Write((int) value);
}
else if(value is long)
{
dataOut.Write(LONG_TYPE);
dataOut.Write((long) value);
}
else if(value is float)
{
dataOut.Write(FLOAT_TYPE);
dataOut.Write((float) value);
}
else if(value is double)
{
dataOut.Write(DOUBLE_TYPE);
dataOut.Write((double) value);
}
else if(value is byte[])
{
byte[] data = (byte[]) value;
dataOut.Write(BYTE_ARRAY_TYPE);
dataOut.Write(data.Length);
dataOut.Write(data);
}
else if(value is string)
{
string s = (string) value;
// is the string big??
if(s.Length > 8191)
{
dataOut.Write(BIG_STRING_TYPE);
((EndianBinaryWriter) dataOut).WriteString32(s);
}
else
{
dataOut.Write(STRING_TYPE);
((EndianBinaryWriter) dataOut).WriteString16(s);
}
}
else if(value is IDictionary)
{
dataOut.Write(MAP_TYPE);
MarshalPrimitiveMap((IDictionary) value, dataOut);
}
else if(value is IList)
{
dataOut.Write(LIST_TYPE);
MarshalPrimitiveList((IList) value, dataOut);
}
else
{
throw new IOException("Object is not a primitive: " + value);
}
}