Сериализация буферов протокола в XML?

#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 в «числовом» режиме.

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

Ответ №2:

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

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