В настоящее время я работаю над кодом, который сериализуется в одном приложении (C ++) и должен десериализовать его в другом (C #).Я пытаюсь использовать google 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 recieve, у нас есть следующее в обратном вызове:
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 имеет все значения по умолчанию.
Я немного озадачен тем, что здесь происходит, и почти невозможно подключить отладчик к клиентскому приложению, поскольку оно развернуто как плагинв другое приложение, которое не очень хорошо работает с удаленным отладчиком.Буду признателен за любой совет, это поставило меня в тупик.