两台主机相互通信 主机A把数据库返回的DATASET数据集序列化后 计算序列化后BYTE数组的长度 再序列化形成第二个长度为59的BYTE数组 把两个数组合并后通过NetworkStream.Write向主机B发送 主机B先读取前59个BYTE 然后反序列化后获得后续的真正数据BYTE数组长度 从而以此建立固定长度的个缓冲区来接受
byte[] k1 = new byte[59];
byte[] k2 ;
第一次读取 myNetwoekStream.Read(k1,0,59); int length =(反序列化)k1;
k2 = new byte[length + 59];
第二次读取 myNetworkStream.Read(k2,0,59 + length);
最后通过FOR循环获得K2中第59位到最后一位的子数组,最终再反序
列化得到DATASET但是当我设置断点后发现 前后两次读取数据流后数组 K1和 K2的前59个元素竟然不同 但应该是一样的啊 求教高手第一次发贴,可能问题表达的不是很明白:) , 对问题有疑问的可以提问
byte[] k1 = new byte[59];
byte[] k2 ;
第一次读取 myNetwoekStream.Read(k1,0,59); int length =(反序列化)k1;
k2 = new byte[length + 59];
第二次读取 myNetworkStream.Read(k2,0,59 + length);
最后通过FOR循环获得K2中第59位到最后一位的子数组,最终再反序
列化得到DATASET但是当我设置断点后发现 前后两次读取数据流后数组 K1和 K2的前59个元素竟然不同 但应该是一样的啊 求教高手第一次发贴,可能问题表达的不是很明白:) , 对问题有疑问的可以提问
不过 我想 如果在发端将DATASET序列化后 分段发送 例如 长度11000个BYTE数组 每次发4000
发三次 最后一次发送3000BYTE 另补零 凑满4000 然后收端收三次合成 但不知道补零 对于最后反序列化 还原DATASET有没有影响?
int i = socket.receive();
再用Array.Copy( BufferData , 0 , ReceiveData , start , end );来把数据存到receiveData中,最后反序列化
但是 我又有个问题
现在如果仅仅说客户端发个SQL命令给服务器端 然后服务器端回个DATASET回来 是可实现的
但是如果客户端要更新服务器的数据库呢
比如
1)客户端要告诉服务器端要更新哪张表 列如 传个TABLENAME给服务器端
2)客户端要传个新的DATASET给服务器端
那么 在服务器端它通过什么机制来区分两者呢 如 服务器端应该先读取TABLENAME 判断更新哪张表然后再反序列化 还原DATASET 来更新?我不知道应该怎么做?
那么就是说当我读取了59个字节后 再执行myNetworkStream.Read(k2,0,length);
其实就是从第59个字节开始 向后读取length个字节到数组 K2中去了?但是我后来编译了一下 发现 不能对K2进行反序列化编译 还原DATASET
在反序列化时报错 〈〈二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改〉〉我是把序列化和反序列化代码写到DLL中 然后服务器和客户端都调用这个DLL 不存在对象版本更改的问题吧?? 那么--- 二进制流“0”不包含有效的 BinaryHeader---又表示什么意思呢?
但是当进行传输后 在接受端发现长度为76434个BYTE数组 中从第37887个BYTE开始 全为零了 ,
于是我在客户端的程序设了个断点 ,检查发送前的数组,发现将DATASET反序列化后得到的BYTE数组从37887位开始为零 但是到第68590开始又开始有非零数值
难道接受数据流的时候 当出现连续多个零的时候 会默认数据流结束?
如果是这样的话 怎么解决呢??
请教高手啊~~~~