Ошибка Protobuf-net - сериализация фиксированного массива с нулевым значением - PullRequest
3 голосов
/ 02 июня 2011

Я использую библиотеку protobuf-net для сериализации некоторых объектов. У меня есть поле

[ProtoMember(3, DataFormat = DataFormat.FixedSize, IsPacked = true)]
ushort[] foo;

Когда я говорю «1004», а затем сериализую весь объект и читаю его обратно, это нормально. Затем, когда я устанавливаю для foo пустой массив или значение null, сериализую и снова читаю его, он не стирается. Я получаю массив с 3 в нем. Чтобы убедиться, что это не какая-то проблема с файловой системой, я изменил другие свойства и сделал туда-обратно, и все они вели себя как положено.

Кто-нибудь знает, является ли это ошибкой в ​​реализации или функцией?

1 Ответ

2 голосов
/ 02 июня 2011

Это не полностью ясно без воспроизводимого примера, но наиболее вероятным ответом IMO здесь является то, что вы перезаписываете выходной поток (например, файл) без его усечения. Поскольку спецификация protobuf не включает терминаторы (и т. Д.) Для объекта root , он считывает до конца файла. Если затем перезаписать меньше данных, любое содержимое, не усеченное, является мусором.

Теперь, если изменение означает, что мусор в конце не анализируется как protobuf, вы получите исключение, например . Однако, если данные все еще действительны (потому что, например, foo является последним элементом в потоке), они просто прочитают и обработают его. В частности, установка коллекции приводит к тому, что этот элемент не записывается , поэтому, если установить для него значение null, все равно остается действительный поток (если это последнее поле для сериализации).

Если вы этого еще не сделали, убедитесь, что вы обрезали свои выводы (2 простых способа сделать это показаны в посте, связанном выше).

Если это не связано, то я прошу прощения - но без дополнительной информации / воспроизводимого примера я должен использовать небольшую догадку; p

...