Мне кажется, что корнем T здесь является сам массив, т.е.
int[] values = Serializer.Deserialize<int[]>(source);
Если это так, то в настоящее время использует слегка неоптимальный путь для этого сценария (по причине: использования того же пути кода даже на платформах, имеют слабые модели метапрограммирования / отражения, такие как iOS). Я постараюсь потратить несколько часов, приводя это в порядок в какой-то момент, но в ответ на ваш вопрос - вы сможете избежать этой проблемы, просто добавив родительский объект:
[ProtoContract]
public class MyDataWrapper { // need a new name...
[ProtoMember(1)]
public int[] Values { get;set; }
}
и затем:
int[] values = Serializer.Deserialize<MyDataWrapper>(source).Values;
Фактически это полностью совместимо с данными, уже сериализованными через Serialize<int[]>
, при условии, что используемый номер поля равен 1
. Еще одним преимуществом этого подхода является то, что при желании вы можете использовать «упакованный» подформат (доступен только для списков / массивов примитивов, таких как int); хотя, возможно, это не очень хорошая идея в этом случае из-за большой длины (может потребоваться буферизация при сериализации).
Дополнительный контекст; «v1» здесь в основном использует MakeGenericType, чтобы переключиться на что-то подобное выше на лету; однако, поскольку этот подход недоступен во многих дополнительных платформах, на которые ориентирован v2, здесь используется менее элегантный подход. Но теперь, когда он довольно стабилен, я мог бы повторно добавить оптимизированную версию при работе на полной версии .NET 2.0 или выше.