首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >protobufjs :编码/解码包含任意组件的消息

protobufjs :编码/解码包含任意组件的消息
EN

Stack Overflow用户
提问于 2017-02-18 17:30:13
回答 1查看 4.7K关注 0票数 1

我使用的是protobufjs 6.6.3 (运行在nodejs 6.9.1上),我试图编码/解码一个包含任何类型组件的消息,我想知道我是否做对了.

代码语言:javascript
复制
syntax = "proto3";
import "google/protobuf/any.proto";

package myTest;

message TestMessage {
  string message = 1;
  google.protobuf.Any details = 2;
}

我最初的问题是:当我解码一条TestMessage类型的消息时会发生什么:它是否也会自动解码任何部分,或者我需要“手动”解码?

简单地说,我就是这样做的:

  • 创建了一个新的任意消息
  • 将其附加到TestMessage消息
  • 编码/解码TestMessage消息;然后,解码TestMessage的任何部分

代码:

代码语言:javascript
复制
const protobuf = require('protobufjs');
const protoFile = __dirname + '/testAnyProto.proto';

function AnyMessageType(properties) {
    protobuf.Message.call(this, properties); // call the super constructor
}

var root = protobuf.loadSync(protoFile);
protobuf.Class.create(root.lookup('google.protobuf.Any'), AnyMessageType);

var sampleBuffer = new Buffer('ABCDEF', 'utf8');
var sampleAny = new AnyMessageType({
    type_url: "some.type",
    value: sampleBuffer
});

var sampleAnyEncodedBuffer = AnyMessageType.encode(sampleAny).finish();
var sampleAnyEncodedDecoded = AnyMessageType.decode(sampleAnyEncodedBuffer);
//just checking if I am getting back 'ABCDEF' and... I am
console.log(sampleAnyEncodedDecoded.value.toString('utf8'));

var TestMessageType = root.lookup('myTest.TestMessage');
// Create a new message
var testMessage = TestMessageType.create({
    message: 'Some message',
    details: sampleAny //??? when I decode a testMessage, it creates an AnyMessageType, so I assume I am right
});

var encodedTestMessage = TestMessageType.encode(testMessage).finish();
var decodedEncodedTestMessage = TestMessageType.decode(encodedTestMessage);
console.log(decodedEncodedTestMessage.details.value.toString('utf8'));

好的..。所以,问题是:

  1. 当我构建一个TestMessage时,需要使用AnyMessage消息来填充详细信息(按照proto),而不是用编码的AnyMessage消息,对吗?
  2. 解码编码的TestMessage消息,不自动解码AnyMessage组件(详细信息),对吗?至少在我看来是这样..。
  3. 最让我困惑的是,所以我需要上面的确认.我应该在哪里使用AnyMessage编码/解码(我指的是sampleAnyEncodedBuffer = AnyMessageType.encode(sampleAny).finish()调用和解码1)?仅仅是为了编码/解码简单的AnyMessage (简单的意思不是“父”消息的一部分)? 让我这样说:--我正在尝试匹配现有的Java /unpack函数--我的例子--.In,我现在将这些函数与缓冲区<->字符串转换“关联”(请参阅我的最后一行console.log ),我不认为有必要调用AnyMessageType.decode.我错了吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-18 20:30:54

Any传输另一个编码在其中的原型消息时,使用Java解包。当您的Any只传输一个字符串时,显然不需要调用任何解码。您的解码/解压缩是value.toString('utf-8')。您正在直接访问Any的成员type_urlvalue,这正是Java的包解包将您从其中抽象出来的。

当您想要用ThatMessageType (而不是简单的字符串)传输protobuf details时,您将需要ThatMessageType.encode()而不是仅仅创建一个缓冲区,而需要ThatMessageType.decode()而不是调用toString

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42318371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档