Используя Google Protocol Buffers, я могу установить максимальный размер для всех сообщений, которые я кодирую?
если я знаю, что то, что я кодирую, никогда не больше, чем X байты, то Google Protobuffs всегда производил бы буфер размера Y, и если я даю ему меньший объем данных, заполняю его к размеру Y?
Проводной формат для буферов протокола не сделает это тривиальным; я не знаю, как это сделать, но одним из вариантов может быть сериализация в буфер с вашим собственным заголовком длины и заполнение дополнительными данными по мере необходимости.
Вам нужно добавить префикс длины, потому что он не добавляется по умолчанию, и иначе это будет чтение мусора в конце вашего буфера. Даже 0 в конце буфера не будет законным (он будет искать номер поля).
Я не могу прокомментировать версию C++ или C# Джона, но для моей версии C# (protobuf-net), вы должны быть в состоянии сделать что-то вроде (не проверено):
using(var ms = new MemoryStream(fixedLength)) {
ms.SetLength(fixedLength);
Serializer.SerializeWithLengthPrefix(ms, obj);
if(ms.Length > fixedLength) { /* boom */ }
byte[] arr = ms.ToArray(); // use this
}
Это должно десериализовать нормально, если также использовать DeserializeWithLengthPrefix
.
По поводу вопросов (комментариев); SerializeWithLengthPrefix
- это специфичный для protobuf-netметод; может быть что-то в C++ версии, но он довольно простой. Самый простой способ реализовать это с нуля:
в обратном порядке, очевидно:
Это немного сложнее в protobuf-net, так как он предлагает несколько больше опций (как должен быть закодирован int, и нужно ли обернуть это так, чтобы вся штука по-прежнему рассматривалась как поток protobuf со 100% значением - в частности, я подозреваю, что я только что описал поведение, если бы я попросил SerializeWithLengthPrefix
использовать кодировку фиксированной ширины и "поле 0").