私はQt開発のGoogleのプロトコルバッファに浸っていますが、私はそれらを最適に組み込む方法を考え出すのに問題があります。Qt + protobuf、種類?
最終的には、プロトコルバッファを使用してQUdpSocket
とQTcpSocket
で送信します。
プロトコルバッファmessage
とソケット(QByteArray
)を介してデータを送信してからもう一方の側にデータを送信する最も良い方法は何ですか?
私はQt開発のGoogleのプロトコルバッファに浸っていますが、私はそれらを最適に組み込む方法を考え出すのに問題があります。Qt + protobuf、種類?
最終的には、プロトコルバッファを使用してQUdpSocket
とQTcpSocket
で送信します。
プロトコルバッファmessage
とソケット(QByteArray
)を介してデータを送信してからもう一方の側にデータを送信する最も良い方法は何ですか?
いる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;
}
@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())
{
//...
}
}
}
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
の代わりに:
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());
を以下のコードを使用すると、あなたがここに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());
間違いではありませんが、メッセージを特定するにはもう一方の側のe。さらに、データの長さを特定する必要があります。 Protobufは内部的にこれらのことのいずれかをしません。また、ストリーム出力バージョンはフォーマッタの中で最も遅いです。ベクトル/アレイ出力は高速です。 –
私は 'SerializeToArray'メソッドを使用しようとしていますが、' QByteArray'への変換方法を理解することはできません。あなたはそれの例を挙げることができますか? – Jay
フォーマットされたコードについては下記を参照してください - 私はコメントのコードをどのようにフォーマットするのか分かりません。申し訳ありません。 \ n \ n void convertQByteArrayToUser(QByteArray&aByteArray) { com ::あなたの名前空間::ユーザユーザ。 場合(user.has_userid()){ /場合(!user.ParseFromArray(aByteArray.data()、aByteArray.size()))他 {// yayyyyy {// は を解析できませんでした}/... } } } – Viren