Проблема сериализации с использованием protobuf между python и nodejs - PullRequest
0 голосов
/ 02 октября 2018

У меня возникла проблема с совместимостью при сериализации сообщения protobuf между python и nodejs.У меня есть сообщение protobuf, как показано ниже:

message User {
  reserved 2,3;
  string user_id = 1;
  int32 coin = 4;
  int32 exp = 5;
  int32 gem = 6;
  int32 level = 7;
}

Я хотел бы сериализовать экземпляр сообщения, например:

"userId": "3562957934"
"coin": 350
"exp": 1
"gem": 30
"level": 1

, когда я делаю user_pb2.User.SerializeToString () \x0a\x0a\x33\x35\x36\x32\x39\x35\x37\x39\x33\x34\x20\xde\x02\x28\x01\x30\x1e\x38\x01

или в двоичном виде

1101 1110 0000 0010 0010 1000 0000 0001 0011 0000 0001 1110 0011 1000 0000 0001


, когда я пытаюсь десериализовать это сообщение в nodejs, я получаю

"userId": "3562957934"
"coin": 381
"exp": 1
"gem": 30
"level": 1

, которыйимеет неправильное значение "монеты"

, затем я пытаюсь создать экземпляр сообщения (со значением монеты = 350) и десериализовать его в nodejs.Я получаю другой двоичный файл: \x5c\x0a\x5c\x0a\x33\x35\x36\x32\x39\x35\x37\x39\x33\x34\x20\xc3\x9e\x02\x28\x01\x30\x1e\x38\x01

или в двоичном виде:

1100 0011 1001 1110 0000 0010 0010 1000 0000 0001 0011 0000 0001 1110 0011 1000 0000 0001

Я обнаружил, что помимо странных байтов головы \x0a\x0a и \x5c\x0a\x5c\x0a главное различие между сериализацией python и nodejs - это байт 1101 1110 (python) против 1100 0011 1001 1110 (nodejs) или в виде строки 3562957934 �(08 (python) против 3562957934 Þ(08 (nodejs)

мой протокол: /usr/local/bin/protoc -I=protos user.proto --python_out=pb (python) /usr/local/bin/protoc --js_out=import_style=commonjs,binary:protos user.proto -I=protos (nodejs)

Я полагаю, что при одинаковом сообщении сериализация python и nodejs должна быть одинаковой, не так ли?Я пытался найти в Google официальные документы protobuf, но до сих пор не нашел решения.Кто-нибудь сталкивался с такой же проблемой?

1 Ответ

0 голосов
/ 02 октября 2018

Похоже, у вас есть какая-то проблема с кодировкой UTF-8 при передаче сериализованных больших двоичных объектов.Исходные сериализованные байты (из Python) содержат в себе байт 0xDE, но указанная вами версия node.js содержит 0xC3 0x9E, что является кодировкой UTF-8 кодовой точки Unicode U + 00DE.

Я предлагаю вам использовать ASCII-безопасную кодировку, такую ​​как base64, для передачи больших двоичных объектов в целях отладки, просто чтобы быть в безопасности.Как только это сработает, вы можете убедиться, что открыли все соответствующие файлы и потоки в двоичном режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...