2015-09-17 59 views
3

使用protobuf我們可以定義消息並生成它們的類,並且每個類都將知道如何序列化/反序列化爲二進制。protobuf確定要反序列化的消息類型

假設我們已經定義了多個不同的消息, ,並且我們得到了一些字節[],我們如何確定消息類型以使用適當的類和反序列化?

回答

4

你不能。協議緩衝區的連線格式不對消息類型進行編碼,只對標籤號和類型進行編碼。

例如,下面的PROTOS的消息的實例的線格式將是相同的(具有在字符串字段中的相同的數據,很明顯):

message Foo { 
    optional string foo_field = 1; 
} 

message Bar { 
    optional string field_contained_in_bar = 1; 
} 

和以下消息力量的一個實例有相同的編碼也一樣,如果只有字符串字段設置:

message Baz { 
    optional string str = 1; 
    optional int32 num = 2; 
} 

你需要知道哪些消息類型,你期望接收。

請參考編碼示例in the documentation

+0

proto 3中的任何類型怎麼樣?我剛剛閱讀了他們,但似乎這些是要解決這個問題,他們確實包含的類型的URI,對於Java我認爲這是完整的包名稱... https://github.com/google/protobuf/ blob/master/src/google/protobuf/any.proto – vach

+0

或者我可能必須做一些類似的泛型類型{字符串類型,字節消息}然後解碼泛型類型,然後根據類型解碼使用適當的類做decdoe目標消息? (原來是雙解碼) – vach

+0

是的,「any」類型,但這只是一個字段類型 - 如果你的消息只包含非''any'類型,那麼怎麼辦?因爲你必須在每條消息上編寫類型(因爲'any'列表可以包含不同的類型),所以任何一種方法都會非常低效。另外,您不知道包含「any」類型字段的消息的類型。 –

相關問題