Google protobuf, сопоставьте ожидаемый размер сообщения с байтами, полученными из сети ⇐ Python
Google protobuf, сопоставьте ожидаемый размер сообщения с байтами, полученными из сети
Чтобы протестировать получение и десериализацию сообщений protobuf, отправленных с сервера, я хотел бы сравнить полученные сетевые байты с ожидаемым размером сериализованного полностью заполненного сообщения. Есть несколько промежуточных шагов «черного ящика», и я хочу проверить, отправляет ли сервер правильное сериализованное сообщение по запросу. Я уже уверял, что полученные байты из сети на самом деле являются сериализованным сообщением, но не ясно, правильное ли оно.
Тем не менее, два сообщения могут иметь одинаковый сериализованный размер, но это крайний случай, и когда я нажму что-то подобное, это будет частью какого-то дальнейшего шага, и я не хочу включать это в этот вопрос.
>
Я использовал protoc с опцией --python_out dir для создания файла X_pb2.py, содержащего определения сообщений из . файл прототипа.
Я подумал о следующих возможных (хакерских) альтернативах:
1.) Перебрать X_pb2.MY_Message().DESCRIPTOR.fields, определить размеры полей по их индивидуальным размерам и суммировать их, чтобы получить ожидаемый размер полностью заполненного сообщения. р> 2.) Перебрать X_pb2.MY_Message().DESCRIPTOR.fields, определить типы полей и инициализировать их случайным образом. Затем просто вызовите X_pb2.MY_Message().ByteSize()
3.) Инициализируйте X_pb2.MY_Message(), сериализуйте его, а затем получите ByteSize()
Однако я столкнулся с некоторыми проблемами:
1.) При использовании этого варианта расчетный ожидаемый размер сериализованного сообщения меньше исходного сообщения, что невозможно. Например. сообщение, состоящее из [int8_t, int32_t, uint32_t], имеет сериализованный размер 5, тогда как сумма размеров типов данных равна 9. Код: sum([x.GetOptions().ByteSize() для x в X_pb2.MY_Message().DESCRIPTOR.fields])
2.) Я не нашел универсального способа сопоставления кодов целочисленных типов с фактическими типами. Нет ничего такого, protobuf.helpers.GetType(x.type), где x — одно из полей X_pb2.MY_Message().DESCRIPTOR.field. В любом случае, эти решения кажутся очень склонными к копированию и вставке.
3.) То же, что и 2.)
Возможно, вы поможете мне найти решение, чтобы я мог утверждать ожидаемый_размер == bytes_received_from_network.
Чтобы протестировать получение и десериализацию сообщений protobuf, отправленных с сервера, я хотел бы сравнить полученные сетевые байты с ожидаемым размером сериализованного полностью заполненного сообщения. Есть несколько промежуточных шагов «черного ящика», и я хочу проверить, отправляет ли сервер правильное сериализованное сообщение по запросу. Я уже уверял, что полученные байты из сети на самом деле являются сериализованным сообщением, но не ясно, правильное ли оно.
Тем не менее, два сообщения могут иметь одинаковый сериализованный размер, но это крайний случай, и когда я нажму что-то подобное, это будет частью какого-то дальнейшего шага, и я не хочу включать это в этот вопрос.
>
Я использовал protoc с опцией --python_out dir для создания файла X_pb2.py, содержащего определения сообщений из . файл прототипа.
Я подумал о следующих возможных (хакерских) альтернативах:
1.) Перебрать X_pb2.MY_Message().DESCRIPTOR.fields, определить размеры полей по их индивидуальным размерам и суммировать их, чтобы получить ожидаемый размер полностью заполненного сообщения. р> 2.) Перебрать X_pb2.MY_Message().DESCRIPTOR.fields, определить типы полей и инициализировать их случайным образом. Затем просто вызовите X_pb2.MY_Message().ByteSize()
3.) Инициализируйте X_pb2.MY_Message(), сериализуйте его, а затем получите ByteSize()
Однако я столкнулся с некоторыми проблемами:
1.) При использовании этого варианта расчетный ожидаемый размер сериализованного сообщения меньше исходного сообщения, что невозможно. Например. сообщение, состоящее из [int8_t, int32_t, uint32_t], имеет сериализованный размер 5, тогда как сумма размеров типов данных равна 9. Код: sum([x.GetOptions().ByteSize() для x в X_pb2.MY_Message().DESCRIPTOR.fields])
2.) Я не нашел универсального способа сопоставления кодов целочисленных типов с фактическими типами. Нет ничего такого, protobuf.helpers.GetType(x.type), где x — одно из полей X_pb2.MY_Message().DESCRIPTOR.field. В любом случае, эти решения кажутся очень склонными к копированию и вставке.
3.) То же, что и 2.)
Возможно, вы поможете мне найти решение, чтобы я мог утверждать ожидаемый_размер == bytes_received_from_network.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение