二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。

时间:2021-12-16 11:45:52
如题,在网上找了很多资料都不是我的情况!

我现在做的SOCKET网络通信,序列化没问题,传送文字也没问题,我传送图片就出现这个问题了(传送文件我还没有测试),为什么啊!超级郁闷,谁来帮帮我!

31 个解决方案

#1


谁能给我看一下啊?提一下大概什么原因啊?

#2


例行回贴!

#3


倾家荡产了啊,有木有知道的啊,我就纳闷了  普通字符序列化以后可以传送,文件流序列化以后咋么就传送不了了!

#4


Receive数据到一个字节数组,很可能数组长度不够,数据没有接受完整。

#5


那要如何判断它,数据是否完整哩?

#6


数组长度肯定够了,图片的字符流是2W多
我在客户端定义的字符长度为100W+

#7


图片变字节数组后是较大的数据,接受端一次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();

#8


大的图片往往有数兆,定义4M的数组保险点

#9


我试试去,总之先谢谢了!

#10


up.....................

#11


哎....可能我技术有限吧,又出现新的问题了:
输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............

#12


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();

#13


引用 8 楼 zzx509 的回复:
大的图片往往有数兆,定义4M的数组保险点

那要是4.0001M是不是就垮了?

传送4K的文件也必须4M缓冲么?

#14


楼上与7楼的有啥区别么?

#15


引用 13 楼 sp1234 的回复:
引用 8 楼 zzx509 的回复:
大的图片往往有数兆,定义4M的数组保险点

那要是4.0001M是不是就垮了?

传送4K的文件也必须4M缓冲么?

据说你是位大神,能不能帮我想想办法?

#16


引用 11 楼 ch5201314zt 的回复:
哎....可能我技术有限吧,又出现新的问题了:
输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............
你至少应该先去自己高清哪一句出错,然后调试,然后问出具体的问题。

#17


引用 16 楼 sp1234 的回复:
引用 11 楼 ch5201314zt 的回复:
哎....可能我技术有限吧,又出现新的问题了:
输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............
你至少应该先去自己高清哪一句出错,然后调试,然后问出具体的问题。

反序列化的时候出的问题啊!

#18


我定义的一个消息类,将这个消息类序列化传送给客户端.
在客户端进行反序列化,传送普通文字是没有错误的,传送图片流稀奇古怪的问题全出来了

#19


引用 13 楼 sp1234 的回复:
引用 8 楼 zzx509 的回复:
大的图片往往有数兆,定义4M的数组保险点

那要是4.0001M是不是就垮了?

传送4K的文件也必须4M缓冲么?

我错了,缓冲不一定要定的大,反正是要写入内存流ms对象中的。

#20


现在不知道为什么,写不进去撒!

#21


另:  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是我传送过来的消息对象

#22


你在发送端没有指定数据长度,接受端怎么知道数据完整性。

#23


引用 22 楼 zzx509 的回复:
你在发送端没有指定数据长度,接受端怎么知道数据完整性。
这个问题我还没注意过,请问如何指定?
客户端我用:
streamToServer.DataAvailable来判断数据是否接受完毕!

#24


也就是NetworkStream.DataAvailable

#25


那个属性不行的,在数据量较大时,接受端可能读完了缓冲区数据,发送的数据还没有发过来,此时DataAvailable是0,但实际你仍然需要继续Receive数据。
发送端必须在头部加入长度。接受端首先读出长度值,然后循环Receive,直到数据长度达到那个值

#26


我用的是NetworkStream  可能跟您写的不太一样,是没有Receive这个方法的!

我也考虑到了数据量大的时候读完了缓冲区数据,发送的数据还没法完的情况.

不知道可不可以给我一个好一点的解决方案??

244627758我的QQ能否加我详谈?拜谢!

#27


大侠,还在吗?指点指点我吧,急啊....

#28


该回复于2010-05-30 19:15:05被版主删除

#29


怎么这么多人回复,还没解决呢?
我也是报出这个错误。
前天写好了,Client 请求 server 发一张表数据,一切正常(把dataset 序列化和反序列化)。
今天再测试,偶尔报出 “二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。"
确定是反序列化的时候 出的问题,数据接收正常。
查阅msdn,找到一篇微软机器人翻译的文章,看了半天,还是不能解决问题。

#30


问题是解决了的,字符流没有接受完毕!别人私下给我的指点,呵呵!

#31


引用 30 楼 ch5201314zt 的回复:
问题是解决了的,字符流没有接受完毕!别人私下给我的指点,呵呵!


看我的帖子,同样的操作功能,我的错误类型别你的要多几个啊。有图说明的。
谢谢。
http://topic.csdn.net/u/20100805/12/e6ab30cf-1b27-4ec1-9a39-83e8ae6cb6dc.html

#1


谁能给我看一下啊?提一下大概什么原因啊?

#2


例行回贴!

#3


倾家荡产了啊,有木有知道的啊,我就纳闷了  普通字符序列化以后可以传送,文件流序列化以后咋么就传送不了了!

#4


Receive数据到一个字节数组,很可能数组长度不够,数据没有接受完整。

#5


那要如何判断它,数据是否完整哩?

#6


数组长度肯定够了,图片的字符流是2W多
我在客户端定义的字符长度为100W+

#7


图片变字节数组后是较大的数据,接受端一次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();

#8


大的图片往往有数兆,定义4M的数组保险点

#9


我试试去,总之先谢谢了!

#10


up.....................

#11


哎....可能我技术有限吧,又出现新的问题了:
输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............

#12


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();

#13


引用 8 楼 zzx509 的回复:
大的图片往往有数兆,定义4M的数组保险点

那要是4.0001M是不是就垮了?

传送4K的文件也必须4M缓冲么?

#14


楼上与7楼的有啥区别么?

#15


引用 13 楼 sp1234 的回复:
引用 8 楼 zzx509 的回复:
大的图片往往有数兆,定义4M的数组保险点

那要是4.0001M是不是就垮了?

传送4K的文件也必须4M缓冲么?

据说你是位大神,能不能帮我想想办法?

#16


引用 11 楼 ch5201314zt 的回复:
哎....可能我技术有限吧,又出现新的问题了:
输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............
你至少应该先去自己高清哪一句出错,然后调试,然后问出具体的问题。

#17


引用 16 楼 sp1234 的回复:
引用 11 楼 ch5201314zt 的回复:
哎....可能我技术有限吧,又出现新的问题了:
输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............
你至少应该先去自己高清哪一句出错,然后调试,然后问出具体的问题。

反序列化的时候出的问题啊!

#18


我定义的一个消息类,将这个消息类序列化传送给客户端.
在客户端进行反序列化,传送普通文字是没有错误的,传送图片流稀奇古怪的问题全出来了

#19


引用 13 楼 sp1234 的回复:
引用 8 楼 zzx509 的回复:
大的图片往往有数兆,定义4M的数组保险点

那要是4.0001M是不是就垮了?

传送4K的文件也必须4M缓冲么?

我错了,缓冲不一定要定的大,反正是要写入内存流ms对象中的。

#20


现在不知道为什么,写不进去撒!

#21


另:  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是我传送过来的消息对象

#22


你在发送端没有指定数据长度,接受端怎么知道数据完整性。

#23


引用 22 楼 zzx509 的回复:
你在发送端没有指定数据长度,接受端怎么知道数据完整性。
这个问题我还没注意过,请问如何指定?
客户端我用:
streamToServer.DataAvailable来判断数据是否接受完毕!

#24


也就是NetworkStream.DataAvailable

#25


那个属性不行的,在数据量较大时,接受端可能读完了缓冲区数据,发送的数据还没有发过来,此时DataAvailable是0,但实际你仍然需要继续Receive数据。
发送端必须在头部加入长度。接受端首先读出长度值,然后循环Receive,直到数据长度达到那个值

#26


我用的是NetworkStream  可能跟您写的不太一样,是没有Receive这个方法的!

我也考虑到了数据量大的时候读完了缓冲区数据,发送的数据还没法完的情况.

不知道可不可以给我一个好一点的解决方案??

244627758我的QQ能否加我详谈?拜谢!

#27


大侠,还在吗?指点指点我吧,急啊....

#28


该回复于2010-05-30 19:15:05被版主删除

#29


怎么这么多人回复,还没解决呢?
我也是报出这个错误。
前天写好了,Client 请求 server 发一张表数据,一切正常(把dataset 序列化和反序列化)。
今天再测试,偶尔报出 “二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。"
确定是反序列化的时候 出的问题,数据接收正常。
查阅msdn,找到一篇微软机器人翻译的文章,看了半天,还是不能解决问题。

#30


问题是解决了的,字符流没有接受完毕!别人私下给我的指点,呵呵!

#31


引用 30 楼 ch5201314zt 的回复:
问题是解决了的,字符流没有接受完毕!别人私下给我的指点,呵呵!


看我的帖子,同样的操作功能,我的错误类型别你的要多几个啊。有图说明的。
谢谢。
http://topic.csdn.net/u/20100805/12/e6ab30cf-1b27-4ec1-9a39-83e8ae6cb6dc.html