二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。 如题,在网上找了很多资料都不是我的情况!我现在做的SOCKET网络通信,序列化没问题,传送文字也没问题,我传送图片就出现这个问题了(传送文件我还没有测试),为什么啊!超级郁闷,谁来帮帮我! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Receive数据到一个字节数组,很可能数组长度不够,数据没有接受完整。 图片变字节数组后是较大的数据,接受端一次Receive往往只能接收一部分数据,需要循环多次接收。一般发送端在字节流起始位置写入数据长度,后面是实际数据。下面是一个接受端如何取数据的代码,你要注意是否数据确定接受完整,是否反序列化时ms.Position = 0; Socket clientSock = SkAccept.Accept();//阻塞方式以接收传入的连接 byte[] clientData = new byte[1024 * 1000]; MemoryStream ms = new MemoryStream(); int receivedBytesLen = clientSock.Receive(clientData); //数据长度获得 long effetDataLen = BitConverter.ToInt64(clientData, 0); ms.Write(clientData, 8, receivedBytesLen - 8); long recLen = receivedBytesLen;// while (recLen < (8 + effetDataLen)) { receivedBytesLen = clientSock.Receive(clientData); ms.Write(clientData, 0, receivedBytesLen); recLen += receivedBytesLen; } ms.Position = 0; BinaryFormatter bf = new BinaryFormatter(); SockData sockData = (SockData)bf.Deserialize(ms); ms.Close(); 哎....可能我技术有限吧,又出现新的问题了:输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-............... Socket clientSock = SkAccept.Accept();//阻塞方式以接收传入的连接 byte[] clientData = new byte[1024 * 1000]; MemoryStream ms = new MemoryStream(); int receivedBytesLen = clientSock.Receive(clientData); //数据长度获得 long effetDataLen = BitConverter.ToInt64(clientData, 0); ms.Write(clientData, 8, receivedBytesLen - 8); long recLen = receivedBytesLen;// while (recLen < (8 + effetDataLen)) { receivedBytesLen = clientSock.Receive(clientData); ms.Write(clientData, 0, receivedBytesLen); recLen += receivedBytesLen; } ms.Position = 0; BinaryFormatter bf = new BinaryFormatter(); SockData sockData = (SockData)bf.Deserialize(ms); ms.Close(); 那要是4.0001M是不是就垮了?传送4K的文件也必须4M缓冲么? 另: TcpClient client; bool rV = true; try { IPAddress ip=new IPAddress(new byte[]{192,168,3,108}); client = new TcpClient(); client.Connect(ip, 8500); // 与服务器连接 NetworkStream streamToServer = client.GetStream(); MemoryStream ms = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, m); byte[] buffer = ms.ToArray(); streamToServer.Write(buffer, 0, buffer.Length); //发往服务器 client.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); }formatter.Serialize(ms, m);中的m是我传送过来的消息对象 这个问题我还没注意过,请问如何指定?客户端我用:streamToServer.DataAvailable来判断数据是否接受完毕! 那个属性不行的,在数据量较大时,接受端可能读完了缓冲区数据,发送的数据还没有发过来,此时DataAvailable是0,但实际你仍然需要继续Receive数据。发送端必须在头部加入长度。接受端首先读出长度值,然后循环Receive,直到数据长度达到那个值 我用的是NetworkStream 可能跟您写的不太一样,是没有Receive这个方法的!我也考虑到了数据量大的时候读完了缓冲区数据,发送的数据还没法完的情况.不知道可不可以给我一个好一点的解决方案??244627758我的QQ能否加我详谈?拜谢! 怎么这么多人回复,还没解决呢?我也是报出这个错误。前天写好了,Client 请求 server 发一张表数据,一切正常(把dataset 序列化和反序列化)。今天再测试,偶尔报出 “二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。"确定是反序列化的时候 出的问题,数据接收正常。查阅msdn,找到一篇微软机器人翻译的文章,看了半天,还是不能解决问题。 看我的帖子,同样的操作功能,我的错误类型别你的要多几个啊。有图说明的。谢谢。http://topic.csdn.net/u/20100805/12/e6ab30cf-1b27-4ec1-9a39-83e8ae6cb6dc.html wpf 字幕动画切换问题 c#操作数据库将表的数据通过sum求和后,得到一个函数或者查询,怎样把这个新得到的查询列显示在windows窗体上?谢谢 关于RadioBurron的数据绑定问题 新手求救。没分了,急啊。。。。。。。。。。 菜单难题,来者有分,略表心意~ 在TreeView控件中进行排序后,有问题 WPF,XAML不能设置字段值? IBatis使用SQLite数据库,app.config中要怎么配置? VS2012重新安装后,无法创建项目 急,请各位帮帮忙,DLL动态库函数引入问题? 控件间距离的变化 请教
一般发送端在字节流起始位置写入数据长度,后面是实际数据。
下面是一个接受端如何取数据的代码,你要注意是否数据确定接受完整,是否反序列化时ms.Position = 0; Socket clientSock = SkAccept.Accept();//阻塞方式以接收传入的连接 byte[] clientData = new byte[1024 * 1000];
MemoryStream ms = new MemoryStream();
int receivedBytesLen = clientSock.Receive(clientData);
//数据长度获得
long effetDataLen = BitConverter.ToInt64(clientData, 0);
ms.Write(clientData, 8, receivedBytesLen - 8);
long recLen = receivedBytesLen;//
while (recLen < (8 + effetDataLen))
{
receivedBytesLen = clientSock.Receive(clientData);
ms.Write(clientData, 0, receivedBytesLen);
recLen += receivedBytesLen;
}
ms.Position = 0;
BinaryFormatter bf = new BinaryFormatter();
SockData sockData = (SockData)bf.Deserialize(ms);
ms.Close();
输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............
MemoryStream ms = new MemoryStream();
int receivedBytesLen = clientSock.Receive(clientData);
//数据长度获得
long effetDataLen = BitConverter.ToInt64(clientData, 0);
ms.Write(clientData, 8, receivedBytesLen - 8);
long recLen = receivedBytesLen;//
while (recLen < (8 + effetDataLen))
{
receivedBytesLen = clientSock.Receive(clientData);
ms.Write(clientData, 0, receivedBytesLen);
recLen += receivedBytesLen;
}
ms.Position = 0;
BinaryFormatter bf = new BinaryFormatter();
SockData sockData = (SockData)bf.Deserialize(ms);
ms.Close();
bool rV = true;
try
{
IPAddress ip=new IPAddress(new byte[]{192,168,3,108});
client = new TcpClient();
client.Connect(ip, 8500); // 与服务器连接
NetworkStream streamToServer = client.GetStream();
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, m);
byte[] buffer = ms.ToArray();
streamToServer.Write(buffer, 0, buffer.Length); //发往服务器
client.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}formatter.Serialize(ms, m);中的m是我传送过来的消息对象
客户端我用:
streamToServer.DataAvailable来判断数据是否接受完毕!
发送端必须在头部加入长度。接受端首先读出长度值,然后循环Receive,直到数据长度达到那个值
我也是报出这个错误。
前天写好了,Client 请求 server 发一张表数据,一切正常(把dataset 序列化和反序列化)。
今天再测试,偶尔报出 “二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。"
确定是反序列化的时候 出的问题,数据接收正常。
查阅msdn,找到一篇微软机器人翻译的文章,看了半天,还是不能解决问题。
看我的帖子,同样的操作功能,我的错误类型别你的要多几个啊。有图说明的。
谢谢。
http://topic.csdn.net/u/20100805/12/e6ab30cf-1b27-4ec1-9a39-83e8ae6cb6dc.html