2015-06-30 7 views
1

Для ведения журналов мне нужно записать содержимое сообщения буфера протокола google на выход журнала (java). Не нашли способ сделать это еще.буферы протокола google довольно печатаются

Я нашел TextFormat, но TextFormat ожидает экземпляр MessageOrBuilder. Сообщение, которое мне нужно распечатать, не распространяется на MessageOrBuilder, оно расширяет GeneratedMessageLite и реализует MessageLiteOrBuilder.

Любая идея, как я могу получить красивое или, по крайней мере, человекообразное строковое представление из этого сообщения?

+0

Вы можете поделиться своим файлом дескриптора прототипа - мой ответ ниже может помочь, но с файлом - мы можем помочь больше! – Josh

+0

К сожалению, у меня нет файла описания прото. Я получил только этот класс. – peez80

ответ

2

Это звучит, как вы используете Protobuf в «облегченном режиме», то есть файл .proto содержит option optimize_for = LITE_RUNTIME;. Режим Lite удаляет все средства интроспекции протокольных буферов, а TextFormat зависит от возможностей самоанализа. Итак, если вы хотите использовать .toString() (и получите полезный результат), вам нужно будет вернуться из режима Lite в обычный режим.

Это означает, что библиотека будет больше и медленнее запускать. К сожалению, этого практически нет. Если вы хотите интроспекции/стягивания, это стоимость.

Некоторые другие опции, которые вы могли бы рассмотреть, хотя:

  • Если это для отладки, вы можете использовать облегченный режим для «освобождения» строит и использовать обычный режим только для отладочных версий.
  • Для ведения журнала производства может иметь смысл писать журналы в необработанном формате protobuf и декодировать их позже, например. используя protoc --decode или инструмент, который вы пишете сами.
0

Ваш объект protobuf имеет объект строителя на нем. например: YourClass.Builder где option java_outer_classname = "YourClass"

Файл Protobuf desciptor должен содержать тип сообщения в этом примере просто TestMessage например:

package test; 
option java_package="test.package"; 
option java_outer_classname = "YourClass" 

message TestMessage { 
    fields here 
} 
+0

desciptor ==> дескриптор? –

Смежные вопросы