protobufjs: кодирование / декодирование сообщения, которое имеет компонент Any
Я использую 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: автоматически ли оно также декодирует любую часть, или мне нужно сделать это "вручную"?
Вкратце, это то, что я сделал:
- создал новое сообщение
- прикрепить его к сообщению 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. В моем примере я сейчас "связываю" их с преобразованием строки buffer <-> (см. Мою последнюю строку console.log), и я не вижу необходимости вызова AnyMessageType.decode... я не прав?
1 ответ
Java pack-unpack используется, когда Any
транспортирует другое закодированное в нем сообщение protobuf. Когда ваш Any
транспортирует только строку, тогда вам, очевидно, не нужно вызывать декодирование. Ваш декодер / распаковка value.toString('utf-8')
, Вы получаете доступ напрямую Any
участники type_url
а также value
Это то, от чего Java абстрагируется от вас.
Когда вы хотите транспортировать протобуф ThatMessageType
в details
вместо простой строки, тогда вам нужно ThatMessageType.encode()
вместо того, чтобы просто создать буфер, и ThatMessageType.decode()
вместо звонка toString
,