C# 如何处理传入的protobuf消息

C# 如何处理传入的protobuf消息,c#,tcp,protobuf-net,C#,Tcp,Protobuf Net,使用TCPClient的NetworkStream和protobuf-net,我通过TCP发送和接收protobuf消息 我看到了一个类似的问题: 但是在我的例子中,只能有一种消息类型,所以我认为我不需要解析程序 所以我序列化了我的对象并使用tcp/ip发送它,在我的服务器上我尝试反序列化它并获得io异常:无法从传输连接读取数据 客户: ... using (var ms = new MemoryStream()) { Serializer.Serialize(ms, person);

使用TCPClient的NetworkStream和protobuf-net,我通过TCP发送和接收protobuf消息

我看到了一个类似的问题:

但是在我的例子中,只能有一种消息类型,所以我认为我不需要解析程序

所以我序列化了我的对象并使用tcp/ip发送它,在我的服务器上我尝试反序列化它并获得io异常:无法从传输连接读取数据

客户:

...
using (var ms = new MemoryStream())
{
    Serializer.Serialize(ms, person);

    data = ms.ToArray();
}
NetworkStream stream = client.GetStream();

stream.Write(data, 0, data.Length);
服务器:

...
Byte[] bytes = new Byte[256];
String data = null;

while(true) 
{
    Console.Write("Waiting for a connection... ");

    TcpClient client = server.AcceptTcpClient();            
    Console.WriteLine("Connected!");

    data = null;

    NetworkStream stream = client.GetStream();
    Person newPerson = Serializer.Deserialize<Person>(stream);<--- exeption
 }
。。。
字节[]字节=新字节[256];
字符串数据=null;
while(true)
{
控制台。写入(“等待连接…”);
TcpClient client=server.AcceptTcpClient();
控制台。WriteLine(“已连接!”);
数据=空;
NetworkStream=client.GetStream();

Person newPerson=Serializer.Deserialize(stream);我认为这里的简短版本是:使用
SerializeWithLengthPrefix
DeserializeWithLengthPrefix
。默认协议行为是“读取到流的末尾”。序列化时,您不需要
内存流
,顺便说一句;您可以
直接将
序列化到
网络流
。如果出于其他原因需要
内存流
,您可以使用以下方法保存数据副本:

stream.Write(ms.GetBuffer(), 0, (int)ms.Length);