0

我有以下方法可以序列化我的协议缓冲区消息,并且效果很好:

string DroolsMsgTransmission::serialize(const google::protobuf::Message* msg, const HeaderMsg& header)const
{
    unsigned char buffer[20000];

    google::protobuf::io::ArrayOutputStream  arr(buffer, sizeof(buffer));
    google::protobuf::io::CodedOutputStream output(&arr);

    output.WriteVarint32(header.ByteSize());
    header.SerializeToCodedStream(&output);

    output.WriteVarint32(msg->ByteSize());
    msg->SerializeToCodedStream(&output);
    return string((char*)buffer, output.ByteCount());
}

是否可以改用动态缓冲区?我尝试了以下方法:

string DroolsMsgTransmission::serialize(const google::protobuf::Message* msg, const HeaderMsg& header)const
{
    char* buffer = new char[header.ByteSize() + msg->ByteSize()]();

    google::protobuf::io::ArrayOutputStream  arr(buffer, sizeof(buffer));
    google::protobuf::io::CodedOutputStream output(&arr);


    output.WriteVarint32(header.ByteSize());
    header.SerializeToCodedStream(&output);

    output.WriteVarint32(msg->ByteSize());
    msg->SerializeToCodedStream(&output);
    string str = string(buffer);
    delete buffer;
    return str;
}

但这不起作用。当我尝试上面的行时,返回的字符串根本不包含序列化数据。

我也尝试使用 OstreamOutputStream 而不是 ArrayOutputStream,但没有运气。

编辑

感谢评论,我几乎使它工作:

string DroolsMsgTransmission::serialize(const google::protobuf::Message* msg, const HeaderMsg& header)const
{
    char* buffer = new char[header.ByteSize() + msg->ByteSize()]();

    google::protobuf::io::ArrayOutputStream  arr(buffer, header.ByteSize() + msg->ByteSize());
    google::protobuf::io::CodedOutputStream output(&arr);


    output.WriteVarint32(header.ByteSize());
    header.SerializeToCodedStream(&output);

    output.WriteVarint32(msg->ByteSize());
    msg->SerializeToCodedStream(&output);
    string str = string(buffer ,output.ByteCount());
    //return string((char*)buffer, output.ByteCount());
    int toto = header.ByteSize() + msg->ByteSize();
    int tata = output.ByteCount();
    int titi = sizeof(buffer);
    delete buffer;
    return str;
}

我做了什么,我替换了这条线

google::protobuf::io::ArrayOutputStream  arr(buffer, sizeof(buffer));

通过这条线

google::protobuf::io::ArrayOutputStream  arr(buffer, header.ByteSize() + msg->ByteSize());

我现在好多了,但我仍然有一个问题,返回的字符串最后似乎有点被截断。它可能与WriteVarint32有关,但我不明白。有人可以解释为什么吗?

谢谢你。

4

1 回答 1

0

您正在编写 4 件事(标题的大小、标题、消息的大小、消息),但只为其中两个(标题和消息)分配空间。

提示:Varint32 永远不会占用超过 5 个字节。

(另外:你需要两个地方的大小 - 在分配缓冲区和构造时arr。计算一次并将其存储在局部变量中。)

于 2013-10-29T18:33:06.923 回答