2011-01-27 86 views
4

我目前正在研究代碼序列化在一個應用程序(C++),並需要在另一個(C#)反序列化它。我正在嘗試使用谷歌proto + protobuf網,但有些失敗。問題反序列化與谷歌protobuf序列化protobuf網數據

.cc和.cs消息定義文件都是使用它們各自的編譯器從相同的.proto文件生成的。

數據通過UDP發送,並且消息(〜40B)很容易放入單個數據報。

在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); 
    } 
} 

緩衝區確實有它的字節的預期數量,並有搬弄是非的字符串。 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 2011-01-27 23:44:57