gpt4 book ai didi

javascript - 谷歌 protobuf-js : How to parse efficiently my messages

转载 作者:行者123 更新时间:2023-11-28 03:54:32 24 4
gpt4 key购买 nike

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

目前,我的 .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来管理每种情况(这显然是最糟糕的解决方案)。
  • 我在尝试反序列化的方式上犯了一些错误,这是一个愚蠢的错误。我虽然也许我可以使用 google-protobuf 中的通用 Message.deserialize(),但这是不可能的,因为每个对象都应该实现自己的反序列化方法。
  • 或者最后一个,我应该创建一个 .proto 文件,在其中设置一个基础对象,该对象将为我的应用程序嵌套所有不同的对象。这样我就可以反序列化单一类型的消息,该消息将能够用它反序列化嵌套对象。 (对我来说这是最好的解决方案,但对于后端来说成本相当高)

最佳答案

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

这样,我只有一种方法来反序列化我的对象,然后该方法将分派(dispatch)嵌套已知对象的处理。它运行完美。

关于javascript - 谷歌 protobuf-js : How to parse efficiently my messages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47676960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com