Десериализация списка объектов с помощью protobuf

#python #protocol-buffers #protobuf-net

#python #протокол-буферы #protobuf-net

Вопрос:

Я создаю сервер C # и клиентское приложение python с сокетной связью. Сервер отправляет сериализованный список объектов клиенту, но я понятия не имею (и не смог найти), как десериализовать список в python. Любая помощь будет оценена.

Комментарии:

1. Вы пробовали использовать pickle ?

2. Что вы пробовали? Вы на самом деле используете protoobuf на стороне сервера? Вы пробовали учебник ?

3. Да, я использую protobuf. Я могу десериализовать один объект без проблем, но я понятия не имею, как это сделать со списками. Вот почему я ничего не мог попробовать, потому что я не знаю. @DarinDouglass Я новичок в python, но, думаю, pickle не будет общаться с .net. Вот почему я использую protobuf

4. PS Да, я видел официальный учебник, но в нем не упоминается десериализация списка

Ответ №1:

Хорошо, я нашел решение, если кому-то интересно. Хитрость заключается в создании нового типа сообщения и добавлении исходного по мере повторения. Вот как

 message TransactionPackets {
    repeated TransactionPacket packet = 1;
}

message TransactionPacket {
    required int32 trans_id = 1;
    required string user_id = 2;
    required int64 date = 3;
}
  

Теперь я могу просто десериализовать список объектов, вызвав TransactionPackets .ParseFromString()

Ответ №2:

Проверьте это:

«Формат проводного буфера протокола не является самоограничивающимся, поэтому анализаторы буфера протокола не могут самостоятельно определить, где заканчивается сообщение. Самый простой способ решить эту проблему — записать размер каждого сообщения перед тем, как писать само сообщение. Когда вы считываете сообщения обратно, вы считываете размер, затем считываете байты в отдельный буфер, а затем выполняете синтаксический анализ из этого буфера. «

https://developers.google.com/protocol-buffers/docs/techniques

Комментарии:

1. Я использую protobuf-net. Я не знаю, как он сериализует данные и / или куда он помещает размер каждого сообщения: (