2014-09-25 140 views
3

我需要序列化和反序列化一系列協議緩衝區消息進出字節流。有一些預定義的消息類型。推薦的編碼類型信息的方式是什麼,以便我的應用程序可以知道它應該讀取哪種類型?確定協議緩衝區消息類型的最佳實踐

+0

協議緩衝區*是*序列化的結構化數據。你能解釋爲什麼你認爲你需要對序列化數據進行編碼嗎? – 2014-09-25 22:03:40

回答

1

我沒有特定的順序建議是:

  1. 包括持有原名稱/ ID的字段(並給它在所有的原同場數說1)
  2. 使用self describing message(在頁面的底部)。在這種情況下,你可以

    • 包括FileDescriptorSet作爲一個字段(在你的郵件)
    • 在java中(和其他一些實現),你可以寫的FileDescriptor設置爲分隔的文件的第一條消息。
  3. 保持原始名稱較小,並在文件名中使用原始名稱例如

    salesProto_Store001.bin

    這有幾個好點:

    • 這是立竿見影的明顯發生了什麼文件格式爲
    • 您可以掃描shell腳本發現使用原位置。
    • 該技術可單獨使用或與上述2結合使用。
    • 此技術可用於任何基於架構的文件(例如Cobol)。

最後ProtobufEditor

  • 支持自描述消息,其中

    • 文件描述符是在分隔的文件
    • 第一場中的第一個消息消息
  • 擁有搜索功能將嘗試在比賽中領域在的Protobuf消息針對已知原定義文件,併爲您提供了可能匹配的


背景: 如果您不知道,協議緩衝區原始文件可以轉換爲FileDescriptorSet協議緩衝消息 並存儲

自我描述messagew:

message SelfDescribingMessage { 
    // Set of .proto files which define the type. 
    required FileDescriptorSet proto_files = 1; 

    // Name of the message type. Must be defined by one of the files in 
    // proto_files. 
    required string type_name = 2; 

    // The message data. 
    required bytes message_data = 3; 
} 
6

的最常見的方式做到這一點是利用一個union message

例如:

message AnyMessage { 
    optional Message1 msg1 = 1; 
    optional Message2 msg2 = 2; 
    ... 
} 

然後,所有消息被編碼/一個AnyMessage容器內部解碼。從protobuf 2.6開始,您也可以使用oneof說明符來確保只有一個子消息被設置。