google protobuf-js:如何有效地解析我的消息

时间:2017-12-06 14:43:05

标签: javascript angular websocket protocol-buffers

我正在开发一个Angular5 +前端,它正在使用带有WebSocket的google-protobuf JS与后端进行通信。

我目前有.proto个文件中的2个对象:

  • 请求对象。
  • 通知对象。

然后我创建了一个处理程序服务来获取通过WebSocket发送的消息,但后来我遇到了一个大问题:我无法找到一种方法来有效地解析/反序列化我的对象:

this._socketService.getSocket().onmessage = ((message: Message) => {
  const uiArray = new Uint8Array(message.data);
  this.parseMessage(uiArray);
});

parseMessage(uiArray: Uint8Array) {
  let response = null;

  // DOES NOT WORK
  // response = reqRep.Response.deserializeBinary(uiArray) || notif.BackendStatusNotification.deserializeBinary(uiArray);

  // <==== This is where I need to find a good way to deserialize efficiently my objects
  // TEMPORARY
  if (uiArray.byteLength === 56) {
    response = reqRep.Response.deserializeBinary(uiArray)
  } else {
    response = notif.BackendStatusNotification.deserializeBinary(uiArray);
  }

  // Notify different Observables which object has changed based on their type
  switch (response && response.hasSupplement() && response.getSupplement().array[0]) {
    case 'type.googleapis.com/req.BackendStatusResponse':
       this._responseSubject.next(response);
       break;
     case 'type.googleapis.com/notif.BackendStatusNotification':
       this._notificationSubject.next(response);
       break;
     default:
       console.log('DOESN\'T WORK');
   }
}

我尝试使用代码中显示的||来始终能够反序列化我的响应,但它不起作用:如果第一个失败,我会收到运行时错误。

我有一些见解,但我可能有人可以帮助我:

  • 我必须四处寻找try catch来管理每一个案例(显然这是最糟糕的解决方案)。
  • 我尝试反序列化的方式有些错误,这是一个愚蠢的错误。我可能也许 我可以使用Message.deserialize()中的通用google-protobuf,但由于每个对象都应该实现自己的反序列化方法,因此无法工作。
  • 或者最后一个,我应该创建一个.proto文件,在其中我设置一个基础对象,它将为我的应用程序嵌套我的所有不同对象。这样我就可以反序列化一种能够用它反序列化嵌套对象的消息。 (对我来说,这是最好的解决方案,但后端的成本非常高)

1 个答案:

答案 0 :(得分:0)

最后,我做了我在问题中提到的最后一个选项,即将所有不同的对象封装在一个通用对象中。

这样,我只有一种方法来反序列化我的对象,然后调度嵌套的已知对象的处理。它完美无缺。