Сериализация протокольных буферов в XML? - PullRequest
3 голосов
/ 16 мая 2011

Буферы протокола Учебник Java состояния:

Одной из ключевых функций, предоставляемых классами протокольных сообщений, является отражение. [...] Одним из очень полезных способов использования отражения является преобразование протокольных сообщений в и из других кодировок, таких как XML или JSON.

И если вы посмотрите на com.google.protobuf.Message , то там будет написано:

Самыми большими добавленными функциями [класса Message по сравнению с классом MessageLite] являются самоанализ и рефлексия.

Казалось бы, можно предположить, что буферы протокола готовы к использованию со многими существующими библиотеками сериализации на основе рефлексии Java, но на самом деле я не думаю, что они означают отражение в традиционном Java-смысле этого слова.

например. если я попытаюсь сериализовать одно из моих сообщений буфера протокола с помощью 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 .

Это дает хороший вывод - однако, так как он не выводит значения тега, то есть числовые идентификаторы полей. Так что не похоже, что полученный XML будет очень устойчивым, когда дело доходит до десериализации, то есть, насколько я понимаю, со стандартным сериализацией буфера протокола все будет работать нормально, если вы измените имена полей, но сохраните значения тегов. то же самое, а затем попытайтесь десериализовать последовательность байтов, которая была сериализована до этих изменений.

Кто-нибудь сталкивался с решением для сериализации XML, которое сохраняет большинство привлекательных функций буферов протокола (всего лишь за меньшее время сериализации и большие результирующие сообщения)?

Или разработали, как воспользоваться возможностями "отражения" буферов протокола с одной из популярных существующих библиотек сериализации Java XML?

С уважением,

/ George

PS Если вам интересно, почему я хочу сериализовать в XML, то это потому, что я хочу дешевый (с точки зрения программирования) способ вручную редактировать сообщения при определенных обстоятельствах.

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Protostuff - это другая Protobuf-совместимая библиотека, которая поддерживает сериализацию в JSON в «числовом» режиме.

http://code.google.com/p/protostuff/wiki/JsonSerialization

0 голосов
/ 25 мая 2011

Учитывая ваше сообщение PS, я бы пошел по другому пути, чем попытка сериализации в / из XML. puke Я бы нашел Java-эквивалент следующего.

Я бы посмотрел на google / protobuf / io / printer.h , чтобы сгенерировать UTF-8, читаемые человеком объекты, а затем использовал бы google / protobuf / io / tokenizer. h интерфейс для чтения обратно в манипулируемый объект protobuf. Намного проще, и Protobuf выполняет почти всю работу за вас.

...