2017-09-19 3 views
0

weil es keine extend in proto3, so kombiniere ich die Basis-Nachricht mit google.protobuf.Any Typ Nachricht, aber es ist binäre Länge zu lang istGibt es eine Möglichkeit, Extend mit Proto3 zu implementieren?

.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; 
} 
... 

Datei .java Datei

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 senden Paket an Client, Client kann alle Nachricht zu Base TradeMessage decodieren, das Problem ist die innere Länge ist 8 Bytes, während Paketlänge 56 Bytes ist. die gleiche Funktion implementieren proto2 's erweitern nur zehn weitere Bytes, so gibt es eine Möglichkeit zu implementieren, erweitern Funktion in proto3 oder die Paketlänge zu reduzieren? Dank

Antwort

0

Eine Alternative ist oneof zu verwenden:

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; 
      ... 
    } 
} 

Die codierte Größe noch größer sein wird als mit extend, aber nur um 1-2 Bytes.

Verwandte Themen