2011-05-16 93 views
3

協議緩衝器狀態Java tutorial:由協議消息類別提供將協議緩衝區序列化爲XML?

一個關鍵特性是反射。 [...]使用反射的一個非常有用的方法是將協議消息轉換爲其他編碼(例如XML或JSON)和從其他編碼轉換。

如果你看一下com.google.protobuf.Message它說:

最大的新增功能[過的MessageLite類Message類]是內省和反思。

這似乎表明,協議緩衝區是準備與許多現有的Java反射基於序列化庫使用,但實際上我不認爲他們的意思是在這個詞的傳統意義上的Java反射。

E.g.如果我試圖序列使用XStream我協議緩衝消息之一(一種流行的庫序列化Java對象到XML使用反射),我得到:

<com.x.MyProtos_-MyMessage resolves-to="com.google.protobuf.GeneratedMessageLite$SerializedForm"> 
    <messageClassName>com.x.MyProtos$MyMessage</messageClassName> 
    <asBytes>CjkKDkJXQkUwMDAzNzkzMTA3EgsZAAAAAAAA8D8gASIGEJYBGMIDKhIpuB6F61G4nj8xuB6F61G4 
Xnj8KMQoGQURBQkliEgsZAAAAAAAA8D8gASIGEJYBGMIDKhIpuB6F61G4nj8xuB6F61G4nj8qAyDQ 
Dw==</asBytes> 

[我注意到了XML提到GeneratedMessageLite,即MessageLite的子類,即使序列化的實例是com.google.protobuf.Message的一個實例]

將協議緩衝區序列化爲XML的唯一現有解決方案(使得結果有點人類可讀)我找到的是protobuf-java-format

這產生了很好的輸出 - 但是因爲它不輸出標籤值,即字段的數字ID。所以它看起來並不像所得到的XML在反序列化時非常強壯,也就是說,據我所知,如果您更改字段名稱,標準協議緩衝區序列化將繼續正常工作,但保留標記值相同,然後嘗試反序列化在這些更改之前序列化的字節序列。

有沒有人遇到過一個XML序列化解決方案,它保留了大部分協議緩衝區的吸引力特性(只是懲罰了較慢的序列化時間和較大的結果消息)?

或者研究出如何利用協議緩衝區的「反射」特性與現有的一種流行的Java XML序列化庫進行比較?

問候,

/喬治

PS如果你想知道爲什麼我想序列化到XML這是因爲我想要一個便宜(在編程方面)的方式在某些情況下,手動編輯消息。

回答

0

鑑於你的PS消息,我會去比試圖從XML序列化中,以/不同的路線。 puke我會發現以下Java的等價物。

我想看看google/protobuf/io/printer.h來生成UTF-8,人類可讀的對象,然後使用google/protobuf/io/tokenizer.h接口讀回操作的protobuf對象。更容易,Protobuf爲你做幾乎所有的工作。