c# - 使用由 google 的 protobuf 序列化的 protobuf-net 反序列化数据时出现问题

标签 c# c++ serialization cross-platform protobuf-net

我目前正在处理在一个应用程序 (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 容器具有所有默认值。

我对这里发生的事情感到有点困惑,并且几乎不可能将调试器附加到客户端应用程序,因为它作为插件部署到另一个不能很好地与远程调试器配合使用的应用程序。如果有任何建议,我将不胜感激,这让我很困惑。

最佳答案

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

关于c# - 使用由 google 的 protobuf 序列化的 protobuf-net 反序列化数据时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4813806/

相关文章:

javascript - MVC webgrid 列宽?

c# - 通过意图 URI 启动我的桌面应用程序

c++ - 如何 std::bind() 创建数据成员?

c++ - 使用位域来节省内存

c# - win2D uwp 不会在 inkcanvas 中保存高亮笔画

c# - 将 C# DateTime 作为 DateTime 参数传递给 SQL Server 存储过程

c++ - 如何 std::bind 模板函数?

javascript - 类型错误 : Object of type 'Category' (model) is not JSON serializable

C# - 在另一个类中调用/编写反序列化方法

java - 跨 Activity/fragment 生命周期存储 HashMap 的最佳方式