Как бороться с нулевыми значениями при сериализации массивов с protobuf-net? - PullRequest
6 голосов
/ 07 сентября 2011

Следующий оператор завершается неудачно с NullReferenceException:

TypeModel.Create().DeepClone(new string[1]);

Изучение исходного кода показывает, что исключение выдается преднамеренно, подразумевая, что значения null в массиве нарушают спецификацию буферов протокола (смысл, null не является повторением какого-либо значения).

Хорошо, спецификация верна, но что нам делать, если в коллекции все еще есть нулевое значение?Есть ли решение, кроме того, чтобы удостовериться, что значения null не попали в наши коллекции?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 26 декабря 2012

Смотрите это:

http://code.google.com/p/protobuf-net/issues/detail?id=217

Цитирование соответствующей части :

Комментарий 4 участника проекта marc.gravell, 14 декабря 2011 г.

Я еще не задокументировал эту опцию (она была добавлена ​​как особый запрос), но - на данный момент вы можете включить ее только (например):

RuntimeTypeModel.Default[typeof (YourType)][3].SupportNull = true;

где 3 - номер поля.

Это, вероятно, должно быть доступно и в модели атрибутов ...

Примечание для пользователя "воля" - удалитель моего предыдущего ответа - я знаю, что это не лучшее место, но я не знаю другого способа сообщения Вам, и просто быть спокойным в таком случае неверно: я извините за "слишком короткий" ответ в первый раз, НО не будет ли редактирование более конструктивным, чем внезапное удаление? Ссылка, которую я предоставил, ДЕЙСТВИТЕЛЬНО отвечала на проблему, о чем также свидетельствует комментарий ... Я только случайно обнаружил, что Вы действительно удалили ее.

3 голосов
/ 07 сентября 2011

Это хитрый;на уровне проводников коллекция - это просто повторяющийся тег, и каждый элемент представляет объект.Проще говоря, напрямую не может выразить null в спецификации protobuf. * ​​1004 *

Теперь я могу испачкаться и получить какой-то двойной тег для коллекции сNULL, но, если честно, я думаю, что в целом было бы лучше использовать ненулевой объект, отличный от NULL (если вы понимаете, о чем я).В случае строки, может быть "" подойдет (на самом деле это зависит от контекста).

Я тоже открыт для предложений, но ... нужно будет сохранитьограничения спецификации в виду.

...