2017-09-19 13 views
0

そこproto3にはextendではありませんので、私はgoogle.protobuf.Anyタイプのメッセージをベースメッセージを組み合わせて、それはバイナリの長さがファイルの.javaproto3で拡張を実装する方法はありますか?

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

ファイル.proto

長すぎるだから

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の実装はちょうど10バイト増えるので、proto3に拡張機能を実装する方法はありますか、それともパケットの長さを短くするのですか?おかげ

答えて

0

1つの代替は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バイトによる。

関連する問題