打印 Protobuf 消息时省略字段
Omit fields when printing Protobuf message
是否可以选择在 Google Protobuf 中调用 message.DebugString()
时要考虑的字段或至少要考虑的字段类型?
我有以下留言说明:
message Message
{
optional string name = 1
optional int32 blockSize = 2;
optional bytes block = 3;
}
我只想打印name
和blockSize
,省略了block
字段,恰好这个字段很大(例如:64KB),内容也无足轻重。
我构建了一个专门向 std::stringstream
添加感兴趣字段的方法,但似乎我必须为消息描述中的每个更改修改该方法。
最好的办法是复制邮件,从副本中清除 block
,然后打印它。
Message copy = original;
copy.clear_block();
cout << copy.DebugString() << endl;
请注意,这里没有性能问题,因为 DebugString()
本身已经 比复制邮件慢 很多。
如果你想让它更通用,你可以编写一些基于 protobuf reflection 的代码,它遍历复制的消息并删除所有 bytes
类型的长字段。
是否可以选择在 Google Protobuf 中调用 message.DebugString()
时要考虑的字段或至少要考虑的字段类型?
我有以下留言说明:
message Message
{
optional string name = 1
optional int32 blockSize = 2;
optional bytes block = 3;
}
我只想打印name
和blockSize
,省略了block
字段,恰好这个字段很大(例如:64KB),内容也无足轻重。
我构建了一个专门向 std::stringstream
添加感兴趣字段的方法,但似乎我必须为消息描述中的每个更改修改该方法。
最好的办法是复制邮件,从副本中清除 block
,然后打印它。
Message copy = original;
copy.clear_block();
cout << copy.DebugString() << endl;
请注意,这里没有性能问题,因为 DebugString()
本身已经 比复制邮件慢 很多。
如果你想让它更通用,你可以编写一些基于 protobuf reflection 的代码,它遍历复制的消息并删除所有 bytes
类型的长字段。