有没有办法用proto3实现扩展?

时间:2017-09-19 10:38:59

标签: protocol-buffers

因为extend中没有proto3,所以我将基本消息与google.protobuf.Any类型消息合并,但它的二进制长度太长

.proto file

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中实现扩展函数或减少数据包的长度?感谢

1 个答案:

答案 0 :(得分:0)

另一种方法是使用oneof:

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个字节。