2011-01-27 1 views
4

В настоящее время я работаю над кодом, который сериализуется в одном приложении (C++) и должен десериализовать его в другом (C#). Я пытаюсь использовать google proto + protobuf-net, но что-то не удается.Проблема десериализации данных с protobuf-net, которая была сериализована protobuf google

Файлы описания сообщений .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# стороны, используя 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 имеет все значения по умолчанию.

Я немного озадачен тем, что здесь происходит, и почти невозможно подключить отладчик к клиентскому приложению, поскольку он развертывается в качестве подключаемого модуля к другому приложению, которое плохо работает с удаленным отладчиком , Я был бы признателен за любые советы, это меня насторожило.

ответ

9

Rewind ваш поток - это в конце концов, так 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

Wow. , , Я чувствую себя очень глупым. Спасибо за ответ. – Chuu

Смежные вопросы