C# 令人沮丧的TCP序列化异常:二进制流';0';不包含有效的BinaryHeader
我在上发布了一个问题,看起来主要问题已经解决了,但现在我经常遇到另一个例外: 二进制流“0”不包含 有效的二进制标头。可能原因 流或对象版本无效 在序列化和 反序列化 问题仍在我的接收方法中:C# 令人沮丧的TCP序列化异常:二进制流';0';不包含有效的BinaryHeader,c#,sockets,serialization,tcp,C#,Sockets,Serialization,Tcp,我在上发布了一个问题,看起来主要问题已经解决了,但现在我经常遇到另一个例外: 二进制流“0”不包含 有效的二进制标头。可能原因 流或对象版本无效 在序列化和 反序列化 问题仍在我的接收方法中: public Message Receive() { if (_tcpClient == null || !_tcpClient.Connected) { throw new TransportException("Client Not Connected&quo
public Message Receive()
{
if (_tcpClient == null || !_tcpClient.Connected)
{
throw new TransportException("Client Not Connected");
}
// buffers
byte[] msgBuffer;
byte[] sizeBuffer = new byte[sizeof(int)];
// bites read
int readSize = 0;
// message size
int size = 0;
MemoryStream memStream = new MemoryStream();
NetworkStream netStream = _tcpClient.GetStream();
BinaryFormatter formatter = new BinaryFormatter();
try
{
// Read the message length
netStream.Read(sizeBuffer, 0, sizeof(int));
// Extract the message length
size = BitConverter.ToInt32(sizeBuffer, 0);
msgBuffer = new byte[size];
// Fill up the message msgBuffer
do
{
// Clear the buffer
Array.Clear(msgBuffer, 0, size);
// Read the message
readSize += netStream.Read(msgBuffer, 0, _tcpClient.ReceiveBufferSize);
// Write the msgBuffer to the memory streamvb
memStream.Write(msgBuffer, 0, readSize);
} while (readSize < size);
// Reset the memory stream position
memStream.Position = 0;
// Deserialize the message
return (Message)formatter.Deserialize(memStream); // <-- Exception here
}
catch (System.Exception e)
{
if (_tcpClient == null || !_tcpClient.Connected)
{
throw new TransportException("Client Not Connected");
}
else
{
throw e;
}
}
}
公共消息接收()
{
如果(_tcpClient==null | |!_tcpClient.Connected)
{
抛出新的TransportException(“客户端未连接”);
}
//缓冲区
字节[]msgBuffer;
字节[]sizeBuffer=新字节[sizeof(int)];
//咬读
int readSize=0;
//消息大小
int size=0;
MemoryStream memStream=新的MemoryStream();
NetworkStream netStream=\u tcpClient.GetStream();
BinaryFormatter formatter=新的BinaryFormatter();
尝试
{
//阅读信息长度
Read(sizeBuffer,0,sizeof(int));
//提取消息长度
size=BitConverter.ToInt32(sizeBuffer,0);
msgBuffer=新字节[大小];
//填写消息msgBuffer
做
{
//清除缓冲区
Array.Clear(msgBuffer,0,大小);
//读留言
readSize+=netStream.Read(msgBuffer,0,_tcpClient.ReceiveBufferSize);
//将msgBuffer写入内存流VB
Write(msgBuffer,0,readSize);
}而(readSize return(Message)formatter.Deserialize(memStream);//我建议您稍微简化一下代码:
public Message Receive()
{
try
{
if (_tcpClient == null || !_tcpClient.Connected)
{
throw new TransportException("Client Not Connected");
}
using (var stream = _tcpClient.GetStream())
using (var reader = new BinaryReader(stream))
{
int size = reader.ReadInt32();
byte[] buffer = reader.ReadBytes(size);
using (var memStream = new MemoryStream(buffer))
{
var formatter = new BinaryFormatter();
return (Message)formatter.Deserialize(memStream);
}
}
}
catch (System.Exception e)
{
if (_tcpClient == null || !_tcpClient.Connected)
{
throw new TransportException("Client Not Connected");
}
throw e;
}
}
此外,如果你是为了好玩和/或教育目的而这样做的,那就没问题,但是在一个真实的项目中,你应该考虑WCF以便通过有线传输对象。
WCF在客户端服务器上不是很好。第二轮询双工是很原始的技术。
@ Darine,MeSi!:)工作很有魅力!我可以帮忙,但是你没有照顾好你。“还是老字帖了吗?”汉斯,我感谢你的帮助(以及你对另一个字帖的关心):),但达林已经为我提供了解决方案。我只是总是确保在接受回答之前给我合理的时间。