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

     2023-02-16     153

关键词:

【中文标题】google protobuf-js:如何有效地解析我的消息【英文标题】:google protobuf-js : How to parse efficiently my messages 【发布时间】:2017-12-06 14:43:04 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

而且适应后端也很快。

如何在google colab中有效地使用内存?

】如何在googlecolab中有效地使用内存?【英文标题】:Howtoefficientlyusememoryingooglecolab?【发布时间】:2021-12-1413:40:35【问题描述】:我目前正在googlecolab中训练一个视听模型。我正在使用“VoxCeleb”数据集。我正在尝试从数据集中提... 查看详情

如何有效识别未知文件格式

】如何有效识别未知文件格式【英文标题】:HowdoIeffectivelyidentifyanunknownfileformat【发布时间】:2018-09-2102:57:38【问题描述】:我想写一个解析yum配置文件的程序。这些文件如下所示:[google-chrome]name=google-chrome-64-bitbaseurl=http://dl.goo... 查看详情

如何使 Google 登录令牌的有效期超过 1 小时?

】如何使Google登录令牌的有效期超过1小时?【英文标题】:HowtomakeGooglesign-intokenvalidforlongerthan1hour?【发布时间】:2015-12-3009:39:11【问题描述】:我已经成功实现了谷歌登录。我能够对用户进行身份验证,并作为响应收到令牌。... 查看详情

如何向 Google Apps Script Web App 发送有效的 HTTP 请求?

】如何向GoogleAppsScriptWebApp发送有效的HTTP请求?【英文标题】:HowtosendavalidHTTPrequesttoaGoogleAppsScriptWebApp?【发布时间】:2021-02-0318:17:47【问题描述】:我们从C++应用程序(ArduinoSketck)向Google应用脚本网络应用程序发送了一个HTTP请求... 查看详情

如何有效地与多个线程并行查询 google-cloud-spanner?

】如何有效地与多个线程并行查询google-cloud-spanner?【英文标题】:Howtoefficientlyquerygoogle-cloud-spannerinparallelwithmultiplethreads?【发布时间】:2021-06-2223:38:23【问题描述】:(对不起,这是TL;DR;但我很绝望,想要彻底!)我们正在... 查看详情

如何有效地将 google-closure javascript 转换为现代 ES6?

】如何有效地将google-closurejavascript转换为现代ES6?【英文标题】:HowcouldIeffectivelyconvertgoogle-closurejavascripttomodernES6?【发布时间】:2020-06-2902:06:20【问题描述】:我有一个使用google-closure样式模块goog.provide和类等的代码库。我想对... 查看详情

如何有效检测 UI 文本输入以调用 google places API 以获取建议?

】如何有效检测UI文本输入以调用googleplacesAPI以获取建议?【英文标题】:HowtodetectUItextinputeffectivelytocallgoogleplacesAPIforsuggestions?【发布时间】:2016-02-2219:55:59【问题描述】:在UItextfield中检测用户输入以调用位置API以作为用户类... 查看详情

版本更新后如何使用 Google Chrome 和虚拟主机,在 Quantum Firefox 中仍然有效

】版本更新后如何使用GoogleChrome和虚拟主机,在QuantumFirefox中仍然有效【英文标题】:HowtouseGoogleChromeandVirtualHostsafterversionupdate,stillworksinQuantumFirefox【发布时间】:2018-05-3113:06:06【问题描述】:最新版本之后如何在(XAMPP)中使用... 查看详情

如何检查有效的网址?

】如何检查有效的网址?【英文标题】:Howtocheckvalidurl?【发布时间】:2015-08-0819:59:28【问题描述】:如何检查NSURL是否有效?1)如果我输入“facebook.com”,那么它应该添加“http://www”。2)如果我输入“www.facebook.com”,那么它... 查看详情

ReentrantLock 在同一个线程中被神秘地解锁,即使没有其他线程正在访问它

】ReentrantLock在同一个线程中被神秘地解锁,即使没有其他线程正在访问它【英文标题】:ReentrantLockgetsmysteriouslyunlockedwithinthesamethread,evenwhilenootherthreadsareaccessingit【发布时间】:2019-08-1102:24:15【问题描述】:我有一些我认为非常... 查看详情

boost::interprocess::interprocess_condition::wait 在等待时不会原子地解锁互斥锁

...boost::interprocess::interprocess_condition::wait在等待时不会原子地解锁互斥锁【英文标题】:boost::interprocess::interprocess_condition::waitdoesnotatomicallyunlockmutexwhilewaiting【发布时间】:2013-06-1315:03:28【问题描述】:正如当前帖子标题所说,boostb... 查看详情

Google Analytics Metadata API 识别有效组合

】GoogleAnalyticsMetadataAPI识别有效组合【英文标题】:GoogleAnalyticsMetadataAPIIdentifyvalidcombinations【发布时间】:2016-01-1418:30:27【问题描述】:有没有办法使用GoogleAnalyticsMetadataAPI来识别维度和指标的有效组合?类似于此工具的功能:ht... 查看详情

如何创建有效的 Avro 格式文件 nodejs

】如何创建有效的Avro格式文件nodejs【英文标题】:HowtocreatevalidAvroformatfilenodejs【发布时间】:2016-06-1320:21:16【问题描述】:我正在尝试创建一个有效的avro文件以上传到google-bigquery。varavro=require(\'node-avro-io\').DataFile.AvroFile();varsche... 查看详情

Google BigQuery SQL:使滚动平均子查询或加入对大型数据集更有效

...】:2019-11-1922:53:12【问题描述】:首先,我已经弄清楚了如何使用子查询或联接来获得我需要的东西。由于缺乏GBQ经验,我一直面临的问题:GBQ不允许“相关子查询”因为我要查询 查看详情

Google API 错误,但仍然有效

】GoogleAPI错误,但仍然有效【英文标题】:GoogleAPIerror,butstillworks【发布时间】:2015-06-2121:04:17【问题描述】:连接到googledriveAPI时,我在本地主机上收到此控制台错误,但我在脚本中配置的选择器成功显示了我的驱动器的内容:... 查看详情

在 Google 表格中整理/汇总特定数据的有效方法

】在Google表格中整理/汇总特定数据的有效方法【英文标题】:Efficientwaytocollate/aggregatespecificdatainGoogleSheets【发布时间】:2021-12-2021:44:04【问题描述】:我正在寻找一种在Google表格中收集和汇总某些日期的有效方法。我一直在查... 查看详情

您如何在 localhost 中呈现 Google 广告单元?

】您如何在localhost中呈现Google广告单元?【英文标题】:HowdoyourenderGoogleadunitsinlocalhost?【发布时间】:2019-05-3106:36:51【问题描述】:根据研究,2014年有一个先前的问题(IsGoogleadsenseavailableforlocalhost?)建议添加:data-adtest="on"在测试... 查看详情

如何获取 cppcheck 的有效二进制路径?

】如何获取cppcheck的有效二进制路径?【英文标题】:Howtogetvalidbinarypathforcppcheck?【发布时间】:2013-11-0216:57:29【问题描述】:我正在尝试从这个网站安装cppcheclipse:http://code.google.com/a/eclipselabs.org/p/cppcheclipse/wiki/Installation我已按... 查看详情