web-dev-qa-db-ja.com

Google Protocol Buffersを使用してchar *にシリアル化する方法は?

プロトコルバッファを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++に非常に慣れていないことを覚えておいてください。

22
Eamorr

簡単だ:

size_t size = address_book.ByteSizeLong(); 
void *buffer = malloc(size);
address_book.SerializeToArray(buffer, size);

チェック MessageLiteクラスのドキュメント また、これはMessageの親クラスであり、便利なメソッドが含まれています。

41
Evgen Bodunov

出力を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を含めることを忘れないでください。

11
Fox32

ByteSizeLong()を使用してメッセージが占有するバイト数を取得し、次にSerializeToArray()を使用して配列にエンコードされたメッセージを入力できます。

4
David Schwartz

シリアル化されたデータにゼロが含まれる可能性があるという事実に対処するための、もう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
1
GhislainS

配列のスマートポインターを使用したソリューション:

size_t size = address_book.ByteSizeLong();
std::unique_ptr<char[]> serialized(new char[size]);
address_book.SerializeToArray(&serialized[0], static_cast<int>(size));
1
Hemaolle