我使用的是protobufjs 6.6.3 (运行在nodejs 6.9.1上),我试图编码/解码一个包含任何类型组件的消息,我想知道我是否做对了.
syntax = "proto3";
import "google/protobuf/any.proto";
package myTest;
message TestMessage {
string message = 1;
google.protobuf.Any details = 2;
}我最初的问题是:当我解码一条TestMessage类型的消息时会发生什么:它是否也会自动解码任何部分,或者我需要“手动”解码?
简单地说,我就是这样做的:
代码:
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'));好的..。所以,问题是:
发布于 2017-02-18 20:30:54
当Any传输另一个编码在其中的原型消息时,使用Java解包。当您的Any只传输一个字符串时,显然不需要调用任何解码。您的解码/解压缩是value.toString('utf-8')。您正在直接访问Any的成员type_url和value,这正是Java的包解包将您从其中抽象出来的。
当您想要用ThatMessageType (而不是简单的字符串)传输protobuf details时,您将需要ThatMessageType.encode()而不是仅仅创建一个缓冲区,而需要ThatMessageType.decode()而不是调用toString。
https://stackoverflow.com/questions/42318371
复制相似问题