【问题标题】:Omit fields when printing Protobuf message打印 Protobuf 消息时省略字段
【发布时间】:2015-09-17 21:00:28
【问题描述】:

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

我有以下消息描述:

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

我只想打印 nameblockSize 并省略 block 字段,该字段恰好很大(例如:64KB),其内容微不足道。

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

【问题讨论】:

    标签: c++ protocol-buffers


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我认为这是最好的方法。作为一个额外的问题:是否甚至建议与内部包含大 bytes 字段(例如:10MB)的消息进行通信?如果我通过套接字进行通信,我不应该在消息之后立即发送二进制块吗?
    • @AlexandruIrimiea - 根据经验,我会说你不应该对大于 1MB 的 protobuf 进行编码。您的选择是发送多条消息,每条消息都包含一小部分有效负载,或者按照您所说的将有效负载放在消息之后。请注意,我见过人们将 protobuf 编码到 2GB 并侥幸成功,但该库确实不是为那样使用而设计的。
    猜你喜欢
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    相关资源
    最近更新 更多