2011-01-27 5 views
4

私は現在、あるアプリケーション(C++)でシリアル化し、別の(C#)で逆シリアル化する必要があるコードを作成中です。私はgoogle proto + protobuf-netを使用しようとしていますが、何かが失敗しています。Googleのprotobufによってシリアル化されたprotobuf-netでデータをデシリアライズする際の問題

.ccと.csの両方のメッセージ定義ファイルは、同じ.protoファイルのそれぞれのコンパイラで生成されました。

データはUDP経由で送信され、メッセージ(〜40B)は1つのデータグラムに簡単に収まります。 C++サイズに

、ブースト:: ASIOは、関連するコードされており、データを送信するために使用されている:

ProtocolBufferdata data; 
... 
boost::asio::streambuf b; 
std::ostream os(&b); 
data.SerializeToOstream(&os); 
m_Socket.send_to(b.data(), m_Endpoint); 

私はWiresharkのを使用しているので、私は、少なくとも見ることができ、これは正しく動作しているかなり確信しています私がデータグラムで期待しているすべての文字列。 C#の側では、開始/終了レシーブを使用して、我々はコールバックに次き:

byte[] buffer ....   

public void ReceiveData(IAsyncResult iar) 
{ 
    try 
    { 
     Socket remote = (Socket)iar.AsyncState; 
     int recv = remote.EndReceive(iar); 
     using (MemoryStream memStream = new MemoryStream()) 
     { 
      memStream.Write(buffer, 0, recv); 
      ProtoData data = ProtoBuf.Serializer.Deserialize<ProtoData >(memStream); 
      onReceive(data); 
     } 
    } 
    catch (Exception ex) 
    { 
     ... 
    } 
    finally 
    { 
     socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveData), socket); 
    } 
} 

バッファはそれにバイト数の期待値を持っている、とtell-物語の文字列を持っています。 protobuf-netコンテナにはすべてデフォルト値があります。

私はここで何が起こっているのか困惑しています。デバッガは、リモートデバッガではうまく動かない別のアプリケーションへのプラグインとしてデプロイされるため、クライアントアプリケーションに接続することはほとんど不可能です。私はアドバイスをいただければ幸いです。

答えて

9

はあなたのストリームを巻き戻し - それが最後であるので、Readは何もデータを返しません。代わりに

memStream.Write(buffer, 0, recv); 
memStream.Position = 0; // <===========here 
ProtoData data = ProtoBuf.Serializer.Deserialize<ProtoData>(memStream); 

、ストリームを準備するために、オーバーロードのコンストラクタを使用します。

using (MemoryStream memStream = new MemoryStream(buffer, 0, recv)) 
{ 
    ProtoData data = ProtoBuf.Serializer.Deserialize<ProtoData>(memStream); 
+1

うわー。 。 。私は本当にばかげている。答えをありがとう。 – Chuu

関連する問題