protocol-buffers - 有没有办法用proto3实现扩展?

标签 protocol-buffers

因为没有 extendproto3 ,所以我将基本消息与 google.protobuf.Any 结合起来输入消息,但它的二进制长度太长

.proto 文件

message TradeMessage {  
     google.protobuf.Any message = 1;  
     string code = 2;
}  
message Connect {
     int32 seq = 1;
     string appid = 2;
     string clientid = 3;
     string ver = 4;
}
...

.java 文件
TradeProtocol.Connect inner = TradeProtocol.Connect.newBuilder()
                    .setSeq(1)
                    .setAppid("test")
                    .build();

TradeProtocol.TradeMessage packet = TradeProtocol.TradeMessage.newBuilder()
                    .setMessage(Any.pack(inner))
                    .setCode(2)
                    .build();

服务向客户端发送数据包,客户端可以将所有消息解码为基础 TradeMessage,问题是内部长度为 8 个字节,而数据包的长度为 56 个字节。相同的函数实现使用 proto2的扩展只是十个字节,所以有什么方法可以在 proto3 中实现扩展功能或减少数据包的长度?谢谢

最佳答案

一种替代方法是使用其中之一:

message Connect {
     int32 seq = 1;
     string appid = 2;
     string clientid = 3;
     string ver = 4;
}

message TradeMessage {  
     string code = 1;
     oneof inner {
          Connect inner_connect = 2;
          SomeOtherMessage inner_other = 3;
          ...
     }
}  

编码后的大小仍会大于 extend ,但只有 1-2 个字节。

关于protocol-buffers - 有没有办法用proto3实现扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46298306/

相关文章:

python - 有没有办法将 Protocol Buffer 编译成纯 python 代码?

java - 反序列化protobuf java数组

c++ - 如何删除重复字段中的任意对象? (protobuf)

Go:安全地将整数转换为 Protocol Buffer 枚举值的最佳实践

c# - protobuf3 中的重复 Int32Value(可为空的 int 数组)

C++ protobuf消息差异器的Python等效性

import - Protobuf 导入失败

c++ - 将 Protocol Buffer 定义拆分为多个 .proto 文件

dart - 我如何@observe 不实现 observe.Observable 的对象在聚合物中

go - 有没有办法在 golang 中自定义 Marshaling Protobuf?