首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BinaryFormatter异常

BinaryFormatter异常
EN

Stack Overflow用户
提问于 2011-04-10 05:02:37
回答 1查看 2K关注 0票数 8

我试图将对象图从服务器进程移动到客户端。而且它是有效的。至少,当客户机和服务器都在我的dev虚拟机上时,它可以工作。当我在我的基本机器上运行服务器时,它也能工作(客户端在dev vm上)。

不过,当我在媒体中心PC上运行服务器时,它就停止工作了。例外是:

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

这三台PC机都是x64 Windows 7机器。我使用TCPClient和TCPListener以及BinaryFormatter类来完成繁重的工作。

正在传输的数据使用标准的FileStream对象从文件中读取。

如果在客户端我将缓冲区序列化到一个文件中,那么内容(根据BeyondCompare)实际上似乎有所不同吗?!?

我的对象上的所有字符串属性都是在setter中编码和在getter中解码的Base64。

我可以张贴代码,但我不知道问题所在是什么?有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-10 06:41:19

更新:我似乎已经解决了这个问题。我有一个断点,客户端在那里读取服务器响应。

代码语言:javascript
复制
tcpClient.GetStream().Read(buffer, 0, buffer.Length);

并注意到从"problem“服务器读取的字节较少。在一次快速的谷歌搜索之后,我找到了一篇http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/759f3f2f-347b-4bd8-aa05-fb7f681c3426文章,戴夫·穆雷建议:

有几种方法可以更优雅地处理这个问题。如果您没有计划将连接重用到其他任何东西,那么最简单的就是nobugz所建议的。当服务器完成数据发送时,让它关闭()它是连接的结束。当客户端读取关闭前发送的所有数据时,read将开始返回0,此时您知道服务器不打算发送任何其他信息。

因此,我将代码从一次读取更新为:

代码语言:javascript
复制
var buffer = new byte[32768];
var totalBytesRead = 0;
var bytesRead = tcpClient.GetStream().Read(buffer, 0, buffer.Length);

do
{
      totalBytesRead += bytesRead;
      bytesRead = tcpClient.GetStream().Read(buffer, totalBytesRead, bytesRead);

} while (bytesRead > 0);

并更新我的服务器代码以根据post关闭连接。根据@leppie的评论,我可能可以删除我的Base64包装属性..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5609892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档