Мне кажется, что корень 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 или выше.
person
Marc Gravell
schedule
11.12.2011
Deserialize<T>
- этоDeserialize<int[]>
? - person Marc Gravell   schedule 11.12.2011