【问题标题】:How to add message type as object in ProtoBuf (gRPC) - Proto3 Syntax?如何在 ProtoBuf (gRPC) - Proto3 语法中添加消息类型作为对象?
【发布时间】:2019-12-28 11:20:18
【问题描述】:

如何在 ProtoBuf - Proto3 语法中将消息类型作为对象发送?

我想传输对象而不是字符串或数字。

示例

{
  name: 'One',
  date: 'date',
  some: 'some',
...
...
}
syntax = "proto3";

package db;

service Proxy
{
    rpc myFunction(Request) returns (Response);
}

message Request
{
    string name = 1;
}

message Response
{
    object keyvalue = 1;
}

这里出现错误

throw Error("no such Type or Enum '" + path + "' in " + this);
        ^

Error: no such Type or Enum 'object' in Type

--

解决方法

我可以在服务器端将它转换为字符串,然后我可以在客户端 JSON.parse()。

但我想知道,是否有更好的方法。

【问题讨论】:

  • 你能澄清一下你的目标是什么吗?你想表现什么样的对象?
  • 添加了更多的示例描述,你能看看吗?

标签: protocol-buffers grpc proto3 protobuf.js grpc-node


【解决方案1】:

protocol-buffer不支持对象数据类型!

但是您可以通过使用协议缓冲区消息类型本身来模拟您的数据分层。

syntax = "proto3";

package db;

service Proxy
{
    rpc myFunction(Request) returns (Response);
}

message Request
{
    string name = 1;
}

message Response
{
    message obj {
         string key1 = 1;
         string key2 = 2
    }
    obj keyvalue = 1;   // Here you have created your own type obj.
}

在上面的示例中,您可以看到响应消息现在具有 obj 类型的“keyvalue”字段(这是一个自定义您刚刚构建的类型)。

现在您将从服务器的回调中传递 Object 而不是原始类型。

callback(null, { keyvalue: { key1: "value1", key2: "value2" } });

假设您不知道键,但键/值对数据类型相同并且您知道,那么在这种情况下,您可以使用 map<type, type>

message Response
{
   map<string, string> keyvalue = 1;
}
callback(null, { keyvalue: { "key1": "value1", "key5": "value2" } });

参考资料:-

【讨论】:

    【解决方案2】:

    根据您要完成的任务,您可能会使用三种类型中的一种。

    1. bytes 类型表示任意字节字符串。您可以选择以任何您认为合适的方式对您的类型进行编码。
    2. any 类型表示任意 protobuf 消息,允许客户端或服务器对非预定义消息进行编码。这是一串字节,每个消息类型都有一个唯一标识符,语言实现将有办法解包消息。
    3. 您提到使用 Javascript。您可能会使用oneof 的基本类型和map 的对象类型的组合来定义一个Javascript 对象消息。

    【讨论】:

      【解决方案3】:

      如果您要发送的所有键和值都具有相同的类型,则可以使用映射类型。您的示例显示了字符串键和字符串值,因此可以使用类型 map&lt;string, string&gt;

      如果要发送与 JSON 对象结构相似的任意对象数据,可以使用google.protobuf.Struct 消息类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-30
        • 2020-05-29
        • 1970-01-01
        • 2020-06-20
        • 2019-07-07
        • 2011-11-16
        • 2017-02-22
        • 2020-03-12
        相关资源
        最近更新 更多