как сериализовать/десериализовать ответ protobuf из google documentai API?

# #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 сгенерированных (из прото) источников, чтобы выполнить работу за вас.