2010-11-23 15 views
14

私はQt開発のGoogleのプロトコルバッファに浸っていますが、私はそれらを最適に組み込む方法を考え出すのに問題があります。Qt + protobuf、種類?

最終的には、プロトコルバッファを使用してQUdpSocketQTcpSocketで送信します。

プロトコルバッファmessageとソケット(QByteArray)を介してデータを送信してからもう一方の側にデータを送信する最も良い方法は何ですか?

答えて

12

いるProtobufオブジェクトからQByteArrayの作成:

QByteArrayから戻っているProtobufオブジェクトを読む
Person person; // a protobuf object 
person.set_id(123); 
person.set_name("Bob"); 
person.set_email("[email protected]"); 

std::ostringstream out; 
person.SerializeToOstream(&out); 
QByteArray byteArray(out.str().c_str()); 
sendSerializedPersonOverQTcpSocket(byteArray); 

QByteArray byteArray = readSerializedPersonFromQTcpSocket(); 
Person person; 
if (!person.ParseFromArray(byteArray, byteArray.size())) { 
    std::cerr << "Failed to parse person.pb." << std::endl; 
} 
+4

間違いではありませんが、メッセージを特定するにはもう一方の側のe。さらに、データの長さを特定する必要があります。 Protobufは内部的にこれらのことのいずれかをしません。また、ストリーム出力バージョンはフォーマッタの中で最も遅いです。ベクトル/アレイ出力は高速です。 –

+0

私は 'SerializeToArray'メソッドを使用しようとしていますが、' QByteArray'への変換方法を理解することはできません。あなたはそれの例を挙げることができますか? – Jay

+0

フォーマットされたコードについては下記を参照してください - 私はコメントのコードをどのようにフォーマットするのか分かりません。申し訳ありません。 \ n \ n void convertQByteArrayToUser(QByteArray&aByteArray) { com ::あなたの名前空間::ユーザユーザ。 場合(user.has_userid()){ /場合(!user.ParseFromArray(aByteArray.data()、aByteArray.size()))他 {// yayyyyy {// は を解析できませんでした}/... } } } – Viren

3

@James:(:あなたは以下のように、例えば、ParseFromArray()を使用することができますParseFromArray()は、libのproto-buf-liteバージョンでのみ利用可能です)。

void convertQByteArrayToUser(QByteArray& aByteArray) 
{ 
    com::your::name_space::User user; 
    if(!user.ParseFromArray(aByteArray.data(), aByteArray.size())) 
    { 
     //could not parse 
    } 
    else { //yayyyyy    
     if(user.has_userid()) 
     { 
      //... 
     } 
    } 
} 
+0

Downvoteから間違った記述があることをお勧めします。** proto-buf-liteバージョンのlibs **でのみ利用可能です。ちょうどフルバージョンでも利用可能であることを理解するのに2時間かかりました! [Google Light API Documenation](https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message_lite#classes-in-this-file)を引用する:このインターフェースはすべてのプロトコルメッセージオブジェクト。非ライトメッセージはさらに、MessageLiteのサブクラスであるMessageインターフェイスを実装します – SebNag

6

の代わりに:

std::ostringstream out; 
person.SerializeToOstream(&out); 
QByteArray byteArray(out.str().c_str()); 

あなたも書き込むことができます。

QByteArray byteArray(person.SerializeAsString().c_str()); 

EDIT:上記の二つは同じ結果が得られますが、私はそれが正しいだ天気をよく分かりません。この1は、より良い動作しているようです:

QByteArray byteArray(QString::fromStdString(person.SerializeAsString())); 

EDIT2:[OK]を、今私はそれがどのように動作するかを知っている:連載中\ 0文字がある場合、最初の2つの方法が間違っている - それは失われます、それの後にすべてが。 1を書くことができ、それを修正するには:

QByteArray byteArray(person.SerializeAsString().c_str(), person.ByteSize()); 
4

を以下のコードを使用すると、あなたがここにIn protobuf-c, can optional uint32 variable have value 0

良い説明にいるProtobufからQByteArrayを作成するための正しい方法を見つけることができ

std::ostringstream out; 
person.SerializeToOstream(&out); 
QByteArray byteArray(out.str().c_str()); 
sendSerializedPersonOverQTcpSocket(byteArray); 

本当に危険ですメッセージは

QByteArray byteArray; 
byteArray.resize(message.ByteSize()); 
message.SerializeToArray(byteArray.data(), byteArray.size());