谷歌协议缓冲相当打印

时间:2015-06-30 15:06:52

标签: java serialization protocol-buffers

出于记录目的,我需要将google协议缓冲区消息的内容写入日志输出(java)。 Haven还找不到办法。

我找到了TextFormat,但TextFormat需要一个MessageOrBuilder实例。我目前需要打印的消息并没有扩展MessageOrBuilder,它扩展了GeneratedMessageLite并实现了MessageLiteOrBuilder。

任何想法如何从这条消息中获得漂亮或至少人类可读的字符串表示?

2 个答案:

答案 0 :(得分:2)

听起来你在" lite模式"中使用Protobuf,即你的.proto文件包含option optimize_for = LITE_RUNTIME;。 Lite模式删除Protocol Buffers的所有内省功能,TextFormat依赖于这些内省功能。因此,如果您希望能够使用.toString()(并获得有用的结果),则需要从精简模式更改为常规模式。

这意味着启动库会更大更慢。不幸的是,真的没办法解决这个问题。如果你想要内省/字符串化,这就是成本。

您可能会考虑其他一些选项:

  • 如果这是出于调试目的,您可以使用lite模式进行"发布"仅为调试版本构建和使用常规模式。
  • 对于生产日志记录,以原始protobuf格式编写日志并在以后对其进行解码可能是有意义的,例如:使用protoc --decode或您自己编写的工具。

答案 1 :(得分: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
}