2017-02-18 17 views
0

Я использую 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')); 

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

  1. Когда я строю TestMessage, детали является (согласно прото), которое должно быть заполнено сообщением AnyMessage, а не с кодированным сообщением AnyMessage, правильно?
  2. Декодирование закодированного сообщения TestMessage не автоматически декодирует компонент AnyMessage (), правильно? По крайней мере, так оно и выглядит ...
  3. Что меня больше всего беспокоит, и поэтому мне нужны вышеупомянутые подтверждения ... где я должен использовать кодировку/декодирование AnyMessage (я имею в виду sampleAnyEncodedBuffer = AnyMessageType .encode (sampleAny) .finish() звонок и декодирование один)? Просто для кодирования/декодирования простой AnyMessage (простым я имею в виду не часть «родительского» сообщения)?
    Позвольте мне сказать следующее: Я пытаюсь сопоставить существующие функции Java pack/unpack. В моем примере я теперь «связываю» их с буфером < -> преобразование строки (см. Мой последний console.log line), и я не вижу необходимости вызывать AnyMessageType.decode ... я ошибаюсь?

ответ

1

Java пакет-распаковка используется при Any транспортирует другой Protobuf сообщение закодированной в. Когда ваш Any переносит только строку, вам явно не нужно вызывать декодирование. Ваш декодирование/распаковка - value.toString('utf-8'). Вы получаете доступ непосредственно к Any членов type_url и value, из чего вас распаковывает пакет-распаковка Java.

Когда вы хотели бы транспортировать Protobuf ThatMessageType в details вместо простой строки, то вам нужно будет ThatMessageType.encode() вместо того, чтобы просто создать буфер, и ThatMessageType.decode() вместо вызова toString.

+0

Павел, спасибо за подтверждение моих предположений. Это было именно мое понимание (в моем примере value.toString является «ассоциацией» для распаковки). Последнее предложение: это здорово! Я сделал быстрый тест, и он работает как шарм.По какой-то причине (я думаю, определение Any: «Любой тип сообщения позволяет использовать сообщения в виде встроенных типов без определения их .proto»). Я не думал об этом, но в конце концов речь идет о предоставлении буфера в AnyMessage для значения и «позже», способного расшифровать его - спасибо за это! – silverb77

Смежные вопросы