架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9994|回复: 0

[资料] 关于系列化和反序列化的一个问题

[复制链接]
发表于 2015-10-27 19:07:26 | 显示全部楼层 |阅读模式
昨天在做数据库同步测试的时候,用到了一点序列化和反序列化的技术。我把某个表的字段抽象成一个实体类DiagramInfo,然后把客户端新增的记录用一个泛型集合存储,再把这个泛型集合系列化,通过TCP发送到服务端,服务端对其进行反序列化,再把这些数据写入数据库。这大概就是这个操作的流程。

       序列化我用的是System.Runtime.Serialization.Iformatter类,把泛型集合序列化成二进制流。序列化的部分代码如下:

然后使用TCP协议发送,这部分内容省略。

服务端部分接收数据,并保存成MemoryStream,然后对其反序列化,部分代码如下:
这时运行客户端和服务端,进行数据同步,结果出现了如下的错误信息:
Unnamed.jpg
错误行为:diagrams = (List)formater.Deserialize(memstream);
按字面意思是:在转换完成前遇到了流结束。
二、解决方案经过google搜索,对于这个错误有人回答了以下几种错误可能:
1.序列化和反序列化时类型不同,这里可以排除;
2.在序列化时没有清空流的缓冲区,及没有使用Flush()方法,这里也可以排除;
3.反序列化前的接收过程缓冲区大小可能不够,对于这条我觉得应该没问题才对,反序列化是在获取流之后进行的,跟缓冲区大小应该没关系,个人意见,也没试过;
4.在反序列化前加上strem.Position=0。(stream是待反序列化的流,实指memstream)
经过测试,第四种可能适用于我的程序。那么为什么会这样呢,经过单步调试,观察memstream.Postion的值变化,发现每对其进行一次写操作,该值都会指向末尾,这就解释了为什么程序会报这样的错误了。但是我搞不懂的是为什么反序列化函数(Deserialize)不是默认对整个流进行反序列化,而是从Positon的位置开始呢?





上一篇:String[3]: the Size property has an invalid size of 0.
下一篇:vs2010连接服务端vss2005时报的错误,问题如图,求大神支招
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-29 18:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表