# #python #google-cloud-platform #protocol-buffers #proto
Вопрос:
Я работаю с API Google для обработки документов при загрузке. Чего я пытаюсь добиться, так это сохранить протобуф в ответе в виде .proto
файла, чтобы я мог работать с ним позже.
Я могу это сделать response._pb.SerializeToString()
, однако позже я не смог понять, как с этим работать. Я попытался записать этот результат в .proto
файл формата, например:
with open("doc.proto", "wb") as f:
f.write(response._pb.SerializeToString())
Но файл не кажется подходящим .proto
файлом, и я не смог запустить его через компилятор протоколов следующим образом:
protoc -I=. --python_out=. ./doc.proto
Я получаю кучу ошибок, таких как:
doc.proto:7398:6: Invalid control characters encountered in text.
doc.proto:7398:9: Interpreting non ascii codepoint 225.
doc.proto:7398:12: Invalid control characters encountered in text.
doc.proto:7398:15: Need space between number and identifier.
doc.proto:7398:16: Invalid control characters encountered in text.
Подводя итог, я просто пытаюсь сериализовать/десериализовать ответ API protobuf.
Ответ №1:
Я рекомендую вам прочитать о буферах протоколов и учебнике по Python, чтобы лучше понять, как все работает.
Сообщения Protobuf (Буферы протокола) определяются в текстовом формате и часто хранятся в .proto
файлах. Это похожие на схемы определения сообщений, которыми необходимо обмениваться.
Эти прото-файлы компилируются инструментом, вызываемым protoc
в один или несколько исходных файлов языка программирования. Эти источники обеспечивают механизм для вашего кода для создания сообщений буфера протокола, которые согласуются со схемой. Эти сообщения отправляются в двоичном формате, который эффективен для передачи по сетям, но очень сложен для понимания людьми.
В вашем случае (с использованием Python) вы захотите «разделить» получаемые вами ответные сообщения на объекты классов Python, которые protoc
были созданы для вас. Если вы создали прото-файлы, значит, у вас есть исходные файлы. Если их создал другой разработчик, они должны быть в состоянии предоставить вам либо исходные файлы Python, либо файлы proto (из которых вы можете создавать исходные файлы Python).
Затем, когда у вас есть сообщения, не помеченные как объекты Python, вы можете хранить их так, как вы предпочитаете, включая, возможно, преобразование их в JSON и запись в текстовый файл.
Таким образом, вы получаете сообщения protobuf в двоичном коде. Вам необходимо расшифровать их с помощью protoc
сгенерированных источников, прежде чем вы сможете сделать что-то полезное с данными.
ОБРАТИТЕ внимание, что сложно перейти от двоичного кодированного сообщения непосредственно к чему-то полезному, не зная прото (схемы) или не имея
protoc
сгенерированных (из прото) источников, чтобы выполнить работу за вас.