0

我正在使用 protobufjs 6.6.3(在 nodejs 6.9.1 上运行)简而言之,我正在尝试对具有 Any 类型组件的消息进行编码/解码,我想知道我是否做得对......

syntax = "proto3";
import "google/protobuf/any.proto";

package myTest;

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

我最初的问题是:当我解码 TestMessage 类型的消息时发生了什么:它是否也会自动解码 Any 部分,还是我需要“手动”进行解码?
简而言之,这就是我所做的:

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

代码:

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 消息填充,而不是用编码的 AnyMessage 消息填充,对吗?
  2. 编码的 TestMessage 消息的解码,不会自动解码 AnyMessage 组件(详细信息),对吗?至少,在我看来是这样的……
  3. 最让我困惑的是什么,因此我需要上述确认......我应该在哪里使用 AnyMessage 编码/解码(我的意思是sampleAnyEncodedBuffer = AnyMessageType.encode(sampleAny).finish()调用和解码一个)?只是为了编码/解码简单的 AnyMessage(简单我的意思是不是“父”消息的一部分)?
    让我这样说:我正在尝试匹配现有的 Java 打包/解包函数。在我的示例中,我现在将这些与缓冲区<->字符串转换“关联”(参见我的最后一个 console.log 行),我没有看到调用 AnyMessageType.decode 的需要......我错了吗?
4

1 回答 1

1

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

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

于 2017-02-18T20:30:54.157 回答