プロトコルバッファメッセージをシリアル化する次のメソッドがあり、これは完全に機能します:
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 が関係しているのかもしれませんが、わかりません。誰かが理由を説明できますか?
ありがとうございました。