2017-10-11 35 views
0

多條消息我已經在proto文件中的下列信息的Protobuf - 同一類

message User 
required string name = 1; 
required string password = 2; 
  • 我怎樣才能區分同一消息的多個實例?
  • 如果我想序列化一個應用程序的註冊用戶,例如
  • protobuf是否表示?
+0

什麼做ÿ你的意思是「區分同一消息的多個實例」?您可以使用'=='知道它們是否是相同的實例或不是普通的Java方式;你可以知道兩個實例是否使用'equals'具有相同的值。例如: –

+0

:我序列化一個'用戶'。之後,我序列化另一個'用戶'。之後,我想從文件中讀取它們。我如何閱讀所有這些內容?以及如何區分它們? –

+0

你是問如何在一個輸入流中分離多個protobuf消息? – blafasel

回答

0

這隻適用於一些額外的編碼。當protobuf從流中讀取消息時,它不知道一條消息的長度。它只是將字段流視爲名稱/值對,並且沒有指示消息開始或結束的指示符。

docs

如果你想多封郵件寫到一個文件或流,它是由你來跟蹤其中一個消息結束,下開始的。協議緩衝區連線格式不是自定義的,因此協議緩衝區分析程序不能自行確定消息的結束位置。

Google的實現包含一些這個用例的助手類。看看CodedInputStreamCodedOutputStream

用於寫入

一種可能的方式:

  • 連載一個對象到一個存儲緩衝器
  • 使用CodedOutputStream寫緩衝區的長度爲單個數字輸出流
  • 添加包含您的序列化對象到輸出流的內存緩衝區
  • 繼續執行下一個對象
用於讀取

一種可能的方式:

  • 使用CodedInputStream讀取從輸入流
  • 採取從輸入流一樣多的字節的一個數作爲此數字表示到存儲緩衝器
  • 解析這個緩衝重拾一個對象
  • 如果輸入流具有多個字節繼續下一個對象