8

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

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

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

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

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

如果在客户端我将缓冲区序列化为文件,内容(根据 BeyondCompare)实际上似乎不同?!?

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

我可以发布代码,但我不确定问题区域在哪里?有任何想法吗?

4

1 回答 1

1

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

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 的建议。当服务器完成发送数据时,让它关闭()它是连接的结束。当客户端读取关闭之前发送的所有数据时,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 包装属性...

于 2011-04-10T06:41:19.887 回答