Ваш тип выглядит подозрительно, как коллекция, и protobuf-net действительно пытается справиться с этим как таковым. Одним из "исправлений" было бы добавление метода Add(int)
, поскольку , который - это то, что он собирается использовать при десериализации. Я, однако, исследую, почему наличие / отсутствие индексатора имеет значение здесь (это не сразу очевидно для меня).
Обратите внимание, что , поскольку выглядит очень похоже на коллекцию, [ProtoMember(...)]
здесь может не использоваться. Я не уверен на 100%, пока не выясню, какую роль здесь играет индексатор.
Ахаха; К; обнаружил, почему индексатор подключается - по сути, после обнаружения IEnumerable
он пытается идентифицировать Type
коллекции; он использует различные сигналы:
-
<T>
в ICollection<T>
-
SomeType
в Add(SomeType)
-
SomeType
в public SomeTime this[int index] {...}
индексаторе
из них применяется только последний. Тем не менее, IMO, вероятно, следует также использовать <T>
в IEnumerable<T>
(я мог бы настроить это) - это, по крайней мере, сделало бы этот сценарий менее странным (как и улучшение сообщения об ошибке, которое я сделаю).
Подводя итог, у protobuf-net очень много особой обработки для вещей, которые пахнут как коллекции; лично я бы отказался от поддержки IEnumerable<T>
и позволил бы вызывающим абонентам проходить через .data
; сообщение (в какой-то момент) будет отображаться:
Невозможно найти подходящий метод Add для {FullName}