2011-08-14 18 views
6

我想在我的程序中使用協議緩衝區來讀取文件中的數據。我還希望能夠使用任何文本編輯器編輯數據文件,以便開始使用(稍後我將編寫數據編輯器,並切換到完整的二進制文件)。協議緩衝區能否以「調試字符串」格式解析消息?

是否有解析人類可讀格式的方法? (由protobuf本身提供的調試字符串,或其他格式)。

回答

4

也有一種基於文本的格式,但對此的支持是特定於實現的。例如,我不支持在protobuf-net中的所有。但是:是這樣定義的,並在這裏討論(例如):http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.text_format.html

就個人而言,我寧願使用二進制編寫模型周圍的用戶界面。

+1

謝謝!這會做,因爲這是暫時的。在這一點上我不需要可移植性和長期兼容性,如果需要,我會在稍後編寫一個編輯器。 – Gnurfos

0

您確定要使用ProtoBuf嗎?您可以首先使用Json,然後切換到Bson或MessagePack作爲二進制格式。

Json/Bson組合的優點是可以爲它們使用相同的庫(Json.net)。不過,我相信Bson比ProtoBuf要大一些。

或者你可以使用Json/MessagePack。技術上MessagePack比Bson/ProtoBuf IMO更好的二進制格式。但是工具支持更糟,您需要爲Json和MessagePack提供單獨的庫。它支持Json所做的所有事情(特別是它可以在字典中同時使用字符串和整數鍵)。

MsgPack和protobuf的快速比較:

  • 所得數據的大小,如果採用類似的構建體似乎是相當的。
  • 編碼/解碼性能在很大程度上取決於實現,但我期望它具有相似的幅度
  • MsgPack更自我描述。 。在ProtoBuf中,你甚至不會看到某些東西是子消息還是blob。
  • MsgPack支持字典中的非整數鍵。這允許的一件事是,當你不關心大小並且切換到增益較大的整數時,按名稱存儲屬性。
  • MsgPack存儲元素數量而不是陣列/詞典的大小。這具有以下優點:您不需要返回輸出並始終適合大小,因此可以更輕鬆地寫入串行器,並且可以提高寫入速度。另一方面,你不能輕易跳過一個元素,因爲你不知道它的大小。
  • MsgPack自然支持Json的超集,因此您可以輕鬆地從Json遷移。
  • ProtoBuf的工具支持,文檔和流行度要好得多。特別是ProtoBuf.net看起來比MsgPack可用的C#代碼更好。
+0

感謝您的選擇,但我會嘗試protobuf。所有解決方案都非常相似,滿足我的需求,所以我只是隨意選擇一個解決方案。 – Gnurfos

+0

我很好奇:你看到MsgPack中的流氓更好嗎? –

+0

@Marc這更多的自我描述絕對是一大優勢。在ProtoBuf中,我甚至沒有看到是否是子消息或blob。非整數字典鍵也不錯。對於其他差異相對較小,但在其中大多數我稍微喜歡MsgPack。 – CodesInChaos

2

如果不使用命令行工具胸懷,Piqi project包括4種格式之間的轉換piqi convert命令:二進制協議緩衝器,JSON,XML和Piq。 Piq格式專門用於在文本編輯器中查看和編輯數據。

0

該問題沒有指定編程語言,我的答案只是關於Java。

在Java中,Message實例的toString方法返回人類可讀的文本格式。同樣的格式,然後可以通過TextFormat.merge分析爲Message實例:

String messageString = ... 
MyMessage.Builder builder = MyMessage.newBuilder(); 
TextFormat.merge(messageString, builder); 
MyMessage newMessage = builder.build(); 

Variations of the merge method還可以從流中讀取,避免讀取整個消息字符串到內存中。)