google 协议缓冲区漂亮打印
google protocol buffers pretty print
出于日志目的,我需要将 google 协议缓冲区消息的内容写入日志输出 (java)。
还没有找到办法做到这一点。
我找到了 TextFormat,但 TextFormat 需要一个 MessageOrBuilder 实例。我目前需要打印出来的Message没有扩展MessageOrBuilder,它扩展了GeneratedMessageLite并实现了MessageLiteOrBuilder。
知道如何从此消息中获得漂亮的或至少人类可读的字符串表示形式吗?
您的 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
}
听起来您在 "lite mode" 中使用 Protobuf,即您的 .proto
文件包含 option optimize_for = LITE_RUNTIME;
。 Lite 模式移除了 Protocol Buffers 的所有内省功能,而 TextFormat 依赖于这些内省功能。因此,如果您希望能够使用 .toString()
(并获得有用的结果),则需要从精简模式改回常规模式。
这意味着库会更大,启动更慢。不幸的是,真的没有办法解决这个问题。如果要introspection/stringification,这是成本
不过,您可能会考虑其他一些选项:
- 如果这是为了调试目的,您可以对 "release" 构建使用精简模式,而仅对调试构建使用常规模式。
- 对于生产日志记录,以原始 protobuf 格式编写日志并稍后对其进行解码可能是有意义的,例如使用
protoc --decode
或您自己编写的工具。
出于日志目的,我需要将 google 协议缓冲区消息的内容写入日志输出 (java)。 还没有找到办法做到这一点。
我找到了 TextFormat,但 TextFormat 需要一个 MessageOrBuilder 实例。我目前需要打印出来的Message没有扩展MessageOrBuilder,它扩展了GeneratedMessageLite并实现了MessageLiteOrBuilder。
知道如何从此消息中获得漂亮的或至少人类可读的字符串表示形式吗?
您的 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
}
听起来您在 "lite mode" 中使用 Protobuf,即您的 .proto
文件包含 option optimize_for = LITE_RUNTIME;
。 Lite 模式移除了 Protocol Buffers 的所有内省功能,而 TextFormat 依赖于这些内省功能。因此,如果您希望能够使用 .toString()
(并获得有用的结果),则需要从精简模式改回常规模式。
这意味着库会更大,启动更慢。不幸的是,真的没有办法解决这个问题。如果要introspection/stringification,这是成本
不过,您可能会考虑其他一些选项:
- 如果这是为了调试目的,您可以对 "release" 构建使用精简模式,而仅对调试构建使用常规模式。
- 对于生产日志记录,以原始 protobuf 格式编写日志并稍后对其进行解码可能是有意义的,例如使用
protoc --decode
或您自己编写的工具。