#java #reflection #xml-serialization #protocol-buffers
#java #отражение #xml-сериализация #буферы протокола
Вопрос:
В руководстве по Java по буферам протокола говорится:
Одной из ключевых функций, предоставляемых классами сообщений протокола, является отражение. […] Одним из очень полезных способов использования отражения является преобразование сообщений протокола в другие кодировки, такие как XML или JSON, и из них.
И если вы посмотрите на com.google.protobuf.Сообщение в нем говорится:
Самые большие добавленные функции [класса 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.Сообщение ]
Единственным существующим решением для сериализации буферов протокола в XML (таким образом, чтобы результат был в некоторой степени удобочитаемым человеком), которое я нашел, был protobuf-java-format.
Это дает хороший результат — однако, поскольку он не выводит значения тегов, то есть числовые идентификаторы полей. Таким образом, не похоже, что результирующий XML будет очень надежным, когда дело доходит до десериализации, т. Е., насколько я понимаю, при стандартной сериализации буфера протокола все будет продолжать работать нормально, если вы измените имена полей, но сохраните значения тегов теми же, а затем попытаетесь десериализовать последовательность байтов, которая была сериализована до этих изменений.
Кто-нибудь сталкивался с решением для сериализации XML, которое сохраняет большинство привлекательных функций буферов протокола (только с уменьшением времени сериализации и увеличением результирующих сообщений)?
Или выяснили, как воспользоваться преимуществами «отражения» буферов протокола с помощью одной из популярных существующих библиотек сериализации Java XML?
С уважением,
/Джордж
PS если вам интересно, почему я хочу сериализовать в XML, это потому, что мне нужен дешевый (с точки зрения программирования) способ ручного редактирования сообщений при определенных обстоятельствах.
Ответ №1:
Protostuff — это еще одна библиотека, совместимая с Protobuf, которая поддерживает сериализацию в JSON в «числовом» режиме.
Ответ №2:
Учитывая ваше сообщение PS, я бы пошел другим путем, чем пытаться сериализовать в / из XML. puke Я бы нашел Java-эквивалент следующего.
Я бы посмотрел на google / protobuf /io /printer.h сгенерировать объекты в формате UTF-8, читаемые человеком, а затем использовать интерфейс google/protobuf/io/tokenizer.h для обратного чтения в измененном объекте protobuf. Намного проще, и Protobuf делает почти всю работу за вас.