簡體   English   中英

使用由google的protobuf序列化的protobuf-net反序列化數據的問題

[英]Problem deserializing data with protobuf-net that was serialzed by google's protobuf

我目前正在處理在一個應用程序(C ++)中序列化的代碼,並需要在另一個應用程序(C#)中反序列化它。 我正在嘗試使用谷歌proto + protobuf-net,但有些事情失敗了。

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

數據通過UDP發送,消息(~40B)很容易適合單個數據報。

在C ++大小上,boost :: asio用於傳輸數據,相關代碼為:

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

我很確定這是正常的,因為使用wireshark我至少可以看到我期望在數據報中的所有字符串。 在C#端,使用Begin / End接收,我們在回調中有以下內容:

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容器具有所有默認值。

我對這里發生的事情感到有些困惑,並且幾乎不可能將調試器附加到客戶端應用程序,因為它被部署為另一個與遠程調試器不兼容的應用程序的插件。 我很感激任何建議,這讓我很難過。

回滾你的流 - 它在最后,所以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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM