protobuf.net De-Serializer 无限期等待

问题描述

我有一个简单的 TCPlistener,它侦听连接,一旦建立连接,一个方法会尝试发送数据,而服务器端会尝试读取它。

客户端:

using (NetworkStream stream = new NetworkStream(_client.Client,false))
            {
                Serializer.Serialize(stream,MyPersonObject);
            }

服务器端:

using (NetworkStream stream = new NetworkStream(_client.Client,false))
            {
                var myObject = Serializer.DeSerialize<Person>(stream);
            }

但是,我注意到一旦它遇到 DeSerialize 方法,它就会挂起并无限期地等待。 请注意,使用完全相同的步骤使用 BinaryFormatter 时不会发生这种情况。我不确定出了什么问题。

解决方法

protobuf 流不是“关闭的”——默认情况下它会一直读取到流的末尾,这意味着它将一直读取到入站 TCP 套接字被标记为完成。

如果您打算发送多条消息,请尝试使用“WithLengthPrefix”版本的序列化和反序列化;为您添加消息框架,让它知道每个负载的结束位置。