Protobuf-net bug-сериализация фиксированного массива, который имеет значение null


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

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

Когда я устанавливаю его, чтобы сказать ushort[] { 3 }, а затем сериализовать весь объект и прочитать его обратно, это нормально. Затем, когда я устанавливаю foo либо на пустой массив, либо на null, сериализую и снова считываю его, он не стирается. В итоге я получаю массив с 3 в нем. Чтобы убедиться, что это не какая-то проблема файловой системы, я изменил другие свойства и сделал круговую поездку, и все они вели себя так, как ожидалось.

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

1 3

1 ответ:

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

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

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

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