Как преобразовать Protobuf Descriptor в .proto?

Каким образом преобразовать подобный код:
DESCRIPTOR = descriptor.FileDescriptor(
  name='addressbook.proto',
  package='tutorial',
  serialized_pb='\n\x11\x61\x64\x64ressbook.proto\x12\x08tutorial\"\xda
\x01\n\x06Person\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\n\n\x02id
\x18\x02 \x02(\x05\x12\r\n\x05\x65mail\x18\x03 \x03(\t\x12+\n\x05phone
\x18\x04 \x03(\x0b\x32\x1c.tutorial.Person.PhoneNumber\x1aM\n
\x0bPhoneNumber\x12\x0e\.........'

В исходный addressbook.proto с исходным кодом структуры, вроде такого:
message Car {
  required string model = 1;
  enum BodyType {
    sedan = 0;
    hatchback = 1;
    SUV = 2;
  }
  required BodyType type = 2 [default = sedan];
  optional string color = 3;
  required int32 year = 4; 
  message Owner {
    required string name = 1;
    required string lastName = 2; 
    required int64 driverLicense = 3;
  }
  repeated Owner previousOwner = 5;
}

Буду очень благодарен за помощь.
  • Вопрос задан
  • 2850 просмотров
Решения вопроса 1
@xandox
По поводу первого - просто сделай print serialized_pb должно помомчь
По поводу второго - в общем случае никак. Структура, как таковая, в сериализованых данных не хронится. Сериализованые данные выглядят примерно так
[Tag|Type|Value]
где Tag - это тэг поля (то есть - имя поля ты уже не знаешь, и модификаторы его тоже (required, optional, repeated))
Type - смотри в доках, актуалльные значения 0, 1, 2, 5 (вроде)
При этом Tag и Type идут вместе (Tag << 3 | Type) и закодированы varint-ом (что таакое - смотри в доках)
Самая засада в том, что вложеные messages сериализованы точно так же как и bytes и string, то есть если ты не знаешь, что тут должен быть messege, то только попробовав его разобрать можешь это понять. В общем из сериализованых данных вытащить структуру - частично можно, но востоновить в 100% не получится.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы