在python和nodejs之间使用protobuf进行序列化的问题

时间:2018-10-02 08:42:23

标签: python node.js protocol-buffers

在python和nodejs之间序列化protobuf消息时遇到兼容问题。我有一条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)vs 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 :(得分:0)

在传递序列化的Blob时,您似乎遇到了某种UTF-8编码问题。原始序列化字节(来自Python)在其中包含字节0xDE,但您引用的node.js版本却具有0xC3 0x9E,这是Unicode代码点U + 00DE的UTF-8编码

为了安全起见,我建议您使用ASCII安全编码(例如base64)来绕过Blob以进行调试。一旦完成,您可以确保以二进制模式打开所有相关文件和流。