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