Andrew He
Andrew He

Reputation: 61

Is there any way to implement extend with proto3?

because there is no extend in proto3, so I combine the base message with google.protobuf.Any type message, but it's binary length is too long

.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 file

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

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

service send packet to client, client can decode all message to base TradeMessage, the problem is the inner's length is 8 bytes, while packet's length is 56 bytes. the same function implement use proto2's extend just ten more bytes, so is there any way to implement extend function in proto3 or reduce the packet's length ? thanks

Upvotes: 6

Views: 6006

Answers (1)

jpa
jpa

Reputation: 12176

One alternative is to use 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;
          ...
     }
}  

The encoded size will still be larger than with extend, but only by 1-2 bytes.

Upvotes: 1

Related Questions