2012-02-06 7 views
17

プロトコルバッファをchar *にシリアル化したい。これは可能ですか?C++ Googleプロトコルバッファ: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++にはとても新しいことを覚えておいてください。

答えて

34

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

チェックdocumentation of MessageLite classも、それはメッセージの親クラスだし、便利なメソッドが含まれています。

+0

このSerializeToArray関数にはどうすればアクセスできますか?ありがとう、 – Eamorr

+1

int size = address_book.By teSize(); void * buffer = malloc(size); address_book.SerializeToArray(バッファ、サイズ); –

+0

こんにちはEvgen、SerializeToArrayは廃止されましたか?私は最新バージョンのプロトコルバッファー – Eamorr

9

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

+0

あなたは伝説です!コードを提供してくれてありがとう。 – Eamorr

+3

もう1つ - 私はSerializeToOstream関数を使用できません - SerializeWithCachedSizes(...)とSerializeWithCachedSizesToArray(...);( – Eamorr

+3

Googleのprotobufドキュメントによると、protobuf形式はバイナリであり、したがってnullを含む可能性があります私は、nullバイトが提供されたバッファに書き込まれ、通常のCスタイルの関数でそのバッファをさらに使用するため、Protobufのシリアル化の出力でc_str()を呼び出すと、切り詰められたC文字列が返されることがあります。 私はこの方法をまったく使用することをお勧めしません - 率直に言って、protobufsをCスタイルの文字列にシリアル化することは安全ではないと私は信じています。 –

3

ByteSizeを使用して、メッセージが占有するバイト数を取得し、次にSerializeToArrayを使用してエンコードされたメッセージを配列に取り込むことができます。簡単だ

0

さらに、シリアル化されたデータにゼロを含むことができるという事実を世話するもう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 
関連する問題