2017-09-19 55 views
0

因为在proto3没有extend,所以我google.protobuf.Any类型的消息结合基地的消息,但它的二进制长度过长有什么办法可以用proto3来实现扩展吗?

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

回答

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

相关问题