協議緩衝器狀態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這是因爲我想要一個便宜(在編程方面)的方式在某些情況下,手動編輯消息。