It seems to me that the root of T here is the array itself, i.e.
int[] values = Serializer.Deserialize<int[]>(source);
If so, it is currently using a slightly suboptimal path for this scenario (for the reason that: using the same code path even on platforms with weak metaprogramming / reflective models such as iOS). I will try to spend several hours getting it at some point, but in answer to your question - you can avoid the problem here by simply adding the parent object:
[ProtoContract] public class MyDataWrapper {
and then:
int[] values = Serializer.Deserialize<MyDataWrapper>(source).Values;
This is actually fully compatible with data already serialized using Serialize<int[]> if field number 1 . Another advantage of this approach is that you can use the "packed" sub-format if desired (available only for lists / arrays of primitives such as int); although perhaps this is not a great idea in this case due to the large length (this may require buffering during serialization).
Additional context; "v1" here mainly uses MakeGenericType to switch to something like higher on the fly; however, since this approach is not available on many additional platforms for which "v2" is aimed, a less elegant approach is used here. But now that it is fairly stable, I could re-add the optimized version while working on full .NET 2.0 or higher.
source share