打印Protobuf消息时省略字段

Omit fields when printing Protobuf message

本文关键字:字段 时省 消息 Protobuf 打印      更新时间:2023-10-16

在Google Protobuf中调用message.DebugString()时,是否可以选择要考虑的字段或至少考虑的字段类型?

我有以下消息描述:

message Message
{
    optional string name = 1
    optional int32 blockSize = 2;
    optional bytes block = 3;
}

我只想打印nameblockSize,并省略block字段,该字段恰好很大(例如:64KB(,其内容无关紧要。

我构建了一个方法,专门向std::stringstream中只添加感兴趣的字段,但似乎每次更改消息描述时都必须修改该方法。

最好的办法是复制消息,从副本中清除block,然后打印。

Message copy = original;
copy.clear_block();
cout << copy.DebugString() << endl;

请注意,这里没有性能问题,因为DebugString()本身已经比复制消息慢了很多。

如果你想让它更通用,你可以写一些基于protobuf反射的代码,它遍历复制的消息,并删除所有长尺寸的bytes类型的字段。