Кодирование и декодирование протокольного буфера любого типа сообщения - PullRequest
0 голосов
/ 06 августа 2020

У меня есть прототип, который выглядит примерно так.

syntax = "proto3";
import "google/protobuf/any.proto";

message User {
    google.protobuf.Any user = 1;
}

И затем я пытаюсь закодировать и декодировать сообщение, я теряю информацию, которая имеет тип google.protobuf.Any.

const protobuf = require('protobufjs');
const root = protobuf.loadSync("./user.proto")
const User = root.lookupType("User");
var payload = { user: [1,2,3] };
var message = User.create(payload);
console.log(message) // User { user: [ 1, 2, 3 ] }
var buffer = User.encode(message).finish();
var message = User.decode(buffer);
console.log(message) //User { user: Any {} }

Кто-нибудь знает, почему?

1 Ответ

0 голосов
/ 07 августа 2020

Вы должны использовать другое сообщение, чтобы поместить его в поле google.protobuf.Any.
Например: Foo

syntax = "proto3";
import "google/protobuf/any.proto";

message User {
    google.protobuf.Any user = 1;
}

message Foo {
    string bar = 1;
}
const protobuf = require('protobufjs');
const root = protobuf.loadSync("./user.proto")

var User = root.lookupType(".User");

var user1 = User.fromObject({
    user: {
        "@type": "type.googleapis.com/Foo",
        bar: "foobar"
    }
});

console.log(user1)
var buffer = User.encode(user1).finish();
var user2 = User.decode(buffer);
var obj = User.toObject(user2, { json: true });
console.log(obj)
...