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;
}

しかし、これは機能していません。上記の行を試してみると、返された文字列にはシリアル化されたデータがまったく含まれていません。

また、ArrayOutputStream の代わりに OstreamOutputStream を使用しようとしましたが、うまくいきませんでした。

編集

コメントのおかげで、私はほとんどそれを機能させました:

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 つのこと (ヘッダーのサイズ、ヘッダー、メッセージのサイズ、メッセージ) を書いていますが、そのうちの 2 つ (ヘッダーとメッセージ) にのみスペースを割り当てています。

ヒント: Varint32 が 5 バイトを超えることはありません。

(また、2 つの場所でサイズが必要です - バッファを割り当てて を構築するときarr。一度計算してローカル変数に格納します。)

于 2013-10-29T18:33:06.923 に答える