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'));

ОК... итак, вопросы:

  1. Когда я создаю TestMessage, ожидается, что детали (согласно протоколу) будут заполнены сообщением AnyMessage, а не закодированным сообщением AnyMessage, правильно?
  2. Декодирование закодированного сообщения TestMessage, автоматически не декодирует компонент AnyMessage (подробности), правильно? По крайней мере, так мне кажется...
  3. Что меня больше всего озадачивает, и поэтому мне нужны вышеуказанные подтверждения... где я должен использовать кодировку / декодирование 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,

Другие вопросы по тегам