使用Google Protocol Buffer在C ++和JavaScript端点之间序列化/反序列化数据吗?

时间:2019-03-26 22:42:47

标签: javascript c++ reactjs protocol-buffers google-protocol-buffer

我正在研究在C ++应用程序上通过Google协议缓冲区序列化数据,将数据发送到JavaScript应用程序以及反序列化数据以供JavaScript应用程序使用的可能性。但是,由于没有“ ParseFromString()”函数功能,我不确定如何完成此操作,也找不到任何明确的答案或示例。该怎么办?

我正在使用google-protobuf和proto3。我没有做太多尝试……事实是我什至不知道从哪里开始。我想提供一个MCVE,但不知道该如何实现。

我看过“ deserializeBinary”,但是在从接收到的消息中解析数据时,我丢失了键入(deserializeBinary()需要“对象”类型参数)。我正在使用binary-parser从序列化协议缓冲区数据中解析标头。

// var msg == full received message from c++ server 
// which consists of 32 bit header
var parser = new Parser()
  .uint16("header_val_1")
  .uint16("header_val_2")
  .string("msg_payload", {
    zeroTerminated: true
  });
var msgObj = parser.parse(msg);
var payloadData = msgObj.msg_payload;
var newData = ProtoMsg.SpecialData.deserializeBinary(payloadData);
// throws type error (expects 'object')

我希望newData用期望的SpecialData消息类型填充,以便可以检查特定的数据点。

newData.getLength()

但是我无法克服错误,即使那样我也不确定自己是否做对了。

1 个答案:

答案 0 :(得分:0)

您正在做的事情可以工作。但是,您应该考虑javascript中可用的数据类型。没有64位整数可用。有一些第三方javascript库,例如jsbn,可用于任意精度数字。二进制解析器是一个不错的选择,但是它不能处理所有必需的类型。

您必须填写this table的javascript列,而使用javascript则很难涵盖所有内容。

第二,编写解析器绝非易事,您必须遵循encoding spec中的所有规则。这可能是很多工作。

与其他选项(如json)相比,

协议缓冲区主要用于提高性能。但是在javascript的世界中,我怀疑性能不会很出色,并且使用与javascript完全匹配的json可能会更好。

无论如何,实际上都存在protobuf support for js,它不是其主要支持的语言之一,但可用。还有another option。如果您仍在寻找自己编写的内容,则可以看到这些实现如何处理我提到的挑战以及随之而来的其他挑战。