gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:55 25 4
gpt4 key购买 nike

我目前正在处理在一个应用程序 (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com