public object ReadPrimitive()
{
var primitiveType = (ProtocolPrimitiveValue)ReadInt();
switch (primitiveType)
{
case ProtocolPrimitiveValue.ProtocolNull:
return null;
case ProtocolPrimitiveValue.ProtocolBool:
return ReadBool();
case ProtocolPrimitiveValue.ProtocolInt:
return ReadInt();
case ProtocolPrimitiveValue.ProtocolLong:
return ReadLong();
case ProtocolPrimitiveValue.ProtocolDouble:
return ReadDouble();
case ProtocolPrimitiveValue.ProtocolString:
return ReadString();
case ProtocolPrimitiveValue.ProtocolUri:
return ReadUri();
case ProtocolPrimitiveValue.ProtocolDateTime:
return ReadDateTime();
case ProtocolPrimitiveValue.ProtocolTimeSpan:
return ReadTimeSpan();
case ProtocolPrimitiveValue.ProtocolNullable:
return ReadPrimitive();
case ProtocolPrimitiveValue.ProtocolEnum:
{
var fullName = ReadString();
var value = ReadInt();
return Enum.ToObject(Type.GetType(fullName), value);
}
case ProtocolPrimitiveValue.ProtocolRegisteredEnum:
{
var typeId = ReadInt();
var value = ReadInt();
return registry.CreateEnum(typeId, value);
}
case ProtocolPrimitiveValue.ProtocolArray:
{
var elemType = ReadType();
var count = ReadInt();
if (count > 0)
{
var items = new List<object>();
for (int i = 0; i < count; i++)
items.Add(ReadPrimitive());
var result = Array.CreateInstance(elemType.Item2, count);
items.ToArray().CopyTo(result, 0);
return result;
}
else
{
return Array.CreateInstance(elemType.Item2, 0);
}
}
case ProtocolPrimitiveValue.ProtocolDict:
{
var keyType = ReadType();
var valueType = ReadType();
var dictType = typeof (Dictionary<,>).MakeGenericType(keyType.Item2, valueType.Item2);
var count = ReadInt();
var dict = (IDictionary)Activator.CreateInstance(dictType);
for (int i = 0; i < count; i++)
{
var key = ReadPrimitive();
var value = ReadPrimitive();
dict.Add(key, value);
}
return dict;
}
default:
throw new InvalidOperationException("Illegal primitive type: " + primitiveType);
}
}