プロトコルバッファをchar *にシリアル化したい。これは可能ですか?私は次のようにファイルにシリアル化できることを知っています:
fstream output("/home/eamorr/test.bin", ios::out | ios::trunc | ios::binary);
if (!address_book.SerializeToOstream(&output)) {
cerr << "Failed to write address book." << endl;
return -1;
}
しかし、ネットワーク経由で送信するために、Cスタイルのchar *にシリアライズしたいと思います。
これを行う方法?私はC++に非常に慣れていないことを覚えておいてください。
簡単だ:
size_t size = address_book.ByteSizeLong();
void *buffer = malloc(size);
address_book.SerializeToArray(buffer, size);
チェック MessageLiteクラスのドキュメント また、これはMessageの親クラスであり、便利なメソッドが含まれています。
出力をostringstream
にシリアル化し、stream.str()
を使用して文字列を取得し、string.c_str()
を使用してc文字列にアクセスできます。
std::ostringstream stream;
address_book.SerializeToOstream(&stream);
string text = stream.str();
char* ctext = text.c_str();
std::ostringstream
にはsstream
を含めることを忘れないでください。
ByteSizeLong()
を使用してメッセージが占有するバイト数を取得し、次にSerializeToArray()
を使用して配列にエンコードされたメッセージを入力できます。
シリアル化されたデータにゼロが含まれる可能性があるという事実に対処するための、もう1行のコード。
std::ostringstream stream;
address_book.SerializeToOstream(&stream);
string text = stream.str();
char* ctext = text.c_str(); // ptr to serialized data buffer
// strlen(ctext) would wrongly stop at the 1st 0 it encounters.
int data_len = text.size(); // length of serialized data
配列のスマートポインターを使用したソリューション:
size_t size = address_book.ByteSizeLong();
std::unique_ptr<char[]> serialized(new char[size]);
address_book.SerializeToArray(&serialized[0], static_cast<int>(size));