BinaryFormatter exception

本文关键字:exception BinaryFormatter | 更新日期: 2023-09-27 17:49:41

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

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

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

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

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

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

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

我可以邮政编码,但我不确定问题所在?什么好主意吗?

BinaryFormatter exception

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

tcpClient.GetStream().Read(buffer, 0, buffer.Length);

并注意到从"问题"服务器读取的字节更少。在谷歌上快速搜索之后,我找到了这篇文章http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/759f3f2f-347b-4bd8-aa05-fb7f681c3426,其中Dave Murray建议:

有几种方法可以处理这个问题更优雅。如果你不是计划重用连接用于其他的,最简单的是什么nobugz建议。当服务器是完成发送数据,关闭()连接结束了。当客户端已读取之前发送的所有数据Close, Read将开始返回0,此时您知道服务器不打算寄任何东西别的。

所以我更新了我的代码从一个单一的读取:

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

并更新了我的服务器代码,以便按照帖子关闭连接。根据@leppie的评论,我可能会删除我的Base64包装属性…