Я использую protobufjs 6.6.3 (работает на nodejs 6.9.1) Вкратце, я пытаюсь кодировать/декодировать сообщение с компонентом типа Any и мне интересно, если я делаю это правильно ...protobufjs: кодирование/декодирование сообщения с любым компонентом
syntax = "proto3";
import "google/protobuf/any.proto";
package myTest;
message TestMessage {
string message = 1;
google.protobuf.Any details = 2;
}
Моим первоначальным вопрос: что происходит, когда я декодирование сообщения типа TestMessage: она автоматически декодирует Любую часть, а также, или я нужно сделать это вручную?
Короче говоря, это то, что я сделал:
- создал новый Любое сообщение
- прикрепить его к сообщению TestMessage
- кодирования/декодирования TestMessage сообщения; затем декодировать Любая часть 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'));
ОК ... Итак, вопросы:
- Когда я строю TestMessage, детали является (согласно прото), которое должно быть заполнено сообщением AnyMessage, а не с кодированным сообщением AnyMessage, правильно?
- Декодирование закодированного сообщения TestMessage не автоматически декодирует компонент AnyMessage (), правильно? По крайней мере, так оно и выглядит ...
- Что меня больше всего беспокоит, и поэтому мне нужны вышеупомянутые подтверждения ... где я должен использовать кодировку/декодирование AnyMessage (я имею в виду sampleAnyEncodedBuffer = AnyMessageType .encode (sampleAny) .finish() звонок и декодирование один)? Просто для кодирования/декодирования простой AnyMessage (простым я имею в виду не часть «родительского» сообщения)?
Позвольте мне сказать следующее: Я пытаюсь сопоставить существующие функции Java pack/unpack. В моем примере я теперь «связываю» их с буфером < -> преобразование строки (см. Мой последний console.log line), и я не вижу необходимости вызывать AnyMessageType.decode ... я ошибаюсь?
Павел, спасибо за подтверждение моих предположений. Это было именно мое понимание (в моем примере value.toString является «ассоциацией» для распаковки). Последнее предложение: это здорово! Я сделал быстрый тест, и он работает как шарм.По какой-то причине (я думаю, определение Any: «Любой тип сообщения позволяет использовать сообщения в виде встроенных типов без определения их .proto»). Я не думал об этом, но в конце концов речь идет о предоставлении буфера в AnyMessage для значения и «позже», способного расшифровать его - спасибо за это! – silverb77