【问题标题】:Why is ParseFromString() not producing an output in my application using protobuf?为什么 ParseFromString() 没有使用 protobuf 在我的应用程序中产生输出?
【发布时间】:2021-09-08 15:53:07
【问题描述】:

我目前有一个*.cpp 文件,我在其中导入所需的*.proto.h 文件并根据我的*.proto 文件中的一条消息(心跳)实例化一个对象。我的目标是使用set_value()SerializeToString()ParseFromString()。我已经成功完成了前两项任务。使用ParseFromString() 时不会输出到屏幕。我对protobufs 很陌生,所以我可能忽略了一些东西。这是我的代码。

#include <iostream>
#include <fstream>
#include <string>
#include "cpnt.pb.h"

using namespace std;

int main()
{
    wombat::HeartBeat h;

    string m;
    string t;
    string v;

    h.set_value(1);
    v = h.SerializeToString(&m);
    t  = h.ParseFromString(v);

    cout << "\n The message received is:" << h.value();
    cout << "\n The binary data stored in v is:" << v;
    cout << "\n The parsed data stored in t is:" << t <<::endl;
    return 0;

}

这是输出的打印输出:

【问题讨论】:

    标签: c++ networking protocol-buffers


    【解决方案1】:

    您误解了SerializeToString 的工作原理。 h.SerializeToString(&amp;m); 序列化h 并将结果存储在m 中。 h.ParseFromString(v); 从字符串v 中解析为设置h 的成员。所以应该是

    h.set_value(1);
    h.SerializeToString(&m);
    h.ParseFromString(m);
    

    这两个函数都返回 bool,但我承认我没有在文档中找到它的好处。可能是为了发出错误信号。

    【讨论】:

    • 知道如何查看解析后的消息吗?我尝试将 h.ParseFromString(m) 存储到一个变量并打印到屏幕上,它只返回二进制
    • @TellrellWhite std::cout &lt;&lt; m; ?
    • @TellrellWhite 那是因为它是二进制的。它不是文本字符串,我一直不明白为什么在使用/生成字节数组时以这种方式调用这些函数。最好将结果输出为十六进制。
    • @Bart 我花了一周的时间调试才意识到序列化的字符串可以在中间包含空终止符。称它为“字符串”真的不太好
    • @Bart 你是如何以十六进制输出的。我能看到消息吗?
    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2011-01-14
    • 2013-03-10
    • 1970-01-01
    • 2021-06-25
    • 2020-09-14
    相关资源
    最近更新 更多