6fo*_*der 8 .net c# serialization exception binaryformatter
我正在尝试将对象图从服务器进程移动到客户端.它有效.至少它可以在客户端和服务器都在我的开发虚拟机上时工作.当我在我的基本机器(dev vm上的客户端)上运行服务器时,它也可以工作.
当我在媒体中心PC上运行服务器时,它停止工作.例外是:
二进制流'0'不包含有效的BinaryHeader.可能的原因是序列化和反序列化之间的无效流或对象版本更改.
这三台PC都是x64 Windows 7机器.我正在使用TCPClient和TCPListener以及BinaryFormatter
类来完成繁重的工作.
使用标准FileStream
对象从文件中读取正在传输的数据.
如果在客户端我将缓冲区序列化为文件,那么内容(根据BeyondCompare)确实看起来确实有所不同?!?
我的对象上的所有字符串属性都是在setter中进行Base64编码并在getter中解码.
我可以发布代码,但我不确定问题所在的位置?有任何想法吗?
更新:我似乎已经解决了这个问题。我有一个断点,客户端读取服务器响应
tcpClient.GetStream().Read(buffer, 0, buffer.Length);
Run Code Online (Sandbox Code Playgroud)
并指出从“问题”服务器读取的字节数较少。经过快速谷歌后,我发现这篇文章http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/759f3f2f-347b-4bd8-aa05-fb7f681c3426其中Dave Murray建议:
有几种方法可以更优雅地处理这个问题。如果您不打算将连接重新用于其他用途,最简单的方法就是 nobugz 的建议。当服务器发送完数据后,让它 Close() 结束连接。当客户端读取完 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);
Run Code Online (Sandbox Code Playgroud)
并更新了我的服务器代码以按照帖子关闭连接。根据 @leppie 的评论,我可能可以删除我的 Base64 包装属性......
归档时间: |
|
查看次数: |
1687 次 |
最近记录: |