Буферы протокола Учебник 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, то это потому, что я хочу дешевый (с точки зрения программирования) способ вручную редактировать сообщения при определенных обстоятельствах.