【问题标题】:Support multiple schemas in Proto3在 Proto3 中支持多种模式
【发布时间】:2019-08-20 22:02:08
【问题描述】:

我正在创建一个允许传入 jsonObject 中的多个/任意数据的 proto3 模式。我想一次性转换传入的 json 对象。

例如

{"key1":"value",
 "key2": {  //schema A}
 }

我还想在不同的请求中支持 key2 的模式 B。

{"key1":"value",
 "key2": {  //schema B}
 }

我尝试了几种不同的方法,例如oneof,但对于oneof,它需要不同的键名,因为我使用的是相同的key2,在这种情况下它对我不起作用。

这是架构。

message IncomingRequest {
string key1 = 1;
//google.protobuf.Any key2 = 2;  --> not working
    oneof message{
        A payload = 2; 
        B payload = 3; --> duplicate key
    } 
}

有人知道如何实现吗?

【问题讨论】:

    标签: protocol-buffers proto3


    【解决方案1】:

    我能想到的两种方法:

    每个请求的消息类型

    如果您知道,根据请求(例如调用的 HTTP URL),它应该是模式 A 还是 B,我建议为每个请求创建单独的消息类型。这可能会导致您必须定义更多的原型类型,但在您必须编写以使用有效负载的实际代码中使用起来会很简单。

    结构类型

    如果您真的想要/必须重用相同的消息类型,您可以使用Struct proto type 对任何 JSON 结构进行编码/解码。

    message IncomingRequest {
        string key1 = 1;
        google.protobuf.Struct key2 = 2;
    }
    

    尽管从 proto 类型定义来看,它看起来不像你想要的那样,Protobuf 解码器/编码器会以一种特殊的方式处理这种类型,从而为你提供想要的行为。

    此选项的问题在于,您在 proto 中获得了灵活性,但在生成的代码中却失去了表现力,因为如果设置了特定值/类型,您必须进行大量边缘情况检查。

    【讨论】:

      猜你喜欢
      • 2019-11-27
      • 2021-12-06
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 2020-03-21
      • 2011-04-05
      • 2011-05-03
      • 1970-01-01
      相关资源
      最近更新 更多