我应该在 protobuf 中使用哪一个?其中一个,任意,地图?

问题描述 投票:0回答:1

我有一个 .proto,其中有一条名为 Event 的消息。

message Event{
    string id=1;
    string param=2;
}

Event的param字段是biz层定义的模型,不同的biz有不同的模型,例如:

data class Cart(val size:Int, val int price:Int)
data class Goods(val id:String, val name:String)

上面是两个biz Model,为了用Event包装它们,我将模型转换成json字符串,如下所示:

val cartString = Cart(1,2).toJsonString()
val goodsString = Goods("a1","apple").toJsonString()
val cartEvent = Event {
    id = "a"
    param = cartString
}
val goodsEvent = Event {
    id = "b"
    param = goodsString
}

不同商业模式的数量可能超过200+。

这是一个好方法吗?

或者我应该使用 Any 并且会收到 200 多条商务消息吗?

或者地图是更好的方式?喜欢:

message Event{
    string id=1;
    map<string,string> param=3;
}
java protocol-buffers protobuf-java
1个回答
0
投票

答案将取决于您使用 protobuf 想要实现的目标。

  • Protobuf 作为将数据传递给例如的封装格式gRPC:字符串中的JSON很好,它避免了维护 protobuf 模式。
  • 从 JSON 到 protobuf 的动态转换:map 是最接近的等效项,但与 JSON 字符串相比几乎没有任何好处。
  • 定义良好的架构可供使用,但不能由其他程序扩展:oneof,为每种事件类型提供特定消息。
  • 定义良好的架构,可供多个程序使用和扩展:Any,具有针对每种事件类型的特定消息。

此列表按增加实施力度的顺序排列。

它也会影响对方如何处理数据。如果您已经拥有事件的底层模型以及与 JSON 之间的转换,并且该模型可用于所有涉及的程序,则没有必要转换为 protobuf 并返回。但如果对方没有这样的模型可用,您需要指定一个模式 - 无论是在 JSON 中还是在 protobuf 中。

© www.soinside.com 2019 - 2024. All rights reserved.