/// <summary>
/// Decode a value of the given type.
/// Should not be called directly. This interface is used by service client stubs.
/// </summary>
public static object Decode(ByteString value, Type type, Connection client)
{
var stream = new CodedInputStream (value.ToByteArray ());
if (type == typeof(double))
return stream.ReadDouble ();
else if (type == typeof(float))
return stream.ReadFloat ();
else if (type == typeof(int))
return stream.ReadInt32 ();
else if (type == typeof(long))
return stream.ReadInt64 ();
else if (type == typeof(uint))
return stream.ReadUInt32 ();
else if (type == typeof(ulong))
return stream.ReadUInt64 ();
else if (type == typeof(bool))
return stream.ReadBool ();
else if (type == typeof(string))
return stream.ReadString ();
else if (type == typeof(byte[]))
return stream.ReadBytes ().ToByteArray ();
else if (type.IsEnum)
return stream.ReadInt32 ();
else if (typeof(RemoteObject).IsAssignableFrom (type)) {
if (client == null)
throw new ArgumentException ("Client not passed when decoding remote object");
var id = stream.ReadUInt64 ();
if (id == 0)
return null;
return (RemoteObject)Activator.CreateInstance (type, client, id);
} else if (typeof(IMessage).IsAssignableFrom (type)) {
IMessage message = (IMessage)Activator.CreateInstance (type);
message.MergeFrom (stream);
return message;
} else if (type.IsGenericType && type.GetGenericTypeDefinition () == typeof(IList<>))
return DecodeList (value, type, client);
else if (type.IsGenericType && type.GetGenericTypeDefinition () == typeof(IDictionary<,>))
return DecodeDictionary (value, type, client);
else if (type.IsGenericType && type.GetGenericTypeDefinition () == typeof(ISet<>))
return DecodeSet (value, type, client);
else if (type.IsGenericType &&
(type.GetGenericTypeDefinition () == typeof(Tuple<>) ||
type.GetGenericTypeDefinition () == typeof(Tuple<,>) ||
type.GetGenericTypeDefinition () == typeof(Tuple<,,>) ||
type.GetGenericTypeDefinition () == typeof(Tuple<,,,>) ||
type.GetGenericTypeDefinition () == typeof(Tuple<,,,,>) ||
type.GetGenericTypeDefinition () == typeof(Tuple<,,,,,>)))
return DecodeTuple (value, type, client); // TODO: ugly handing of tuple types
throw new ArgumentException (type + " is not a serializable type");
}