解决反序列化(Deserialize)无法找到程序集的错误
来源:互联网 发布:大数据培训考试 编辑:程序博客网 时间:2024/05/16 12:31
原帖地址:http://blog.csdn.net/silverice/archive/2009/10/15/4674831.aspx
在使用.NET序列化对象时,会将程序集信息也包含进去。如果将序列化之后的字节数组通过网络(或其他传输方式)传输到另一个应用程序,再使用Deserialize反序列化还原对象时,可能(注意是可能)会出现无法找到程序集的错误。之所以说是可能,是因为如果两边的应用程序结构(命名空间、类结构、程序名、程序签名、程序版本等)相同,则不会出现该错误。下面说一个具体实例:
在客户端动态生成一条SELECT语句,将该语句发送到服务器执行,再将执行后的结果返回给客户端。(题外话:要实现本功能完全可以不使用序列化和反序列化的方法,本实例只是为了解释如何解决反序列化时出现的无法找到程序集的错误)
解决方案:
创建一个.NET类库,把要传输的对象做成一个结构或类放在类库(假设为ClassLib.dll)中。如:
view plaincopy to clipboardprint?
[Serializable]
public struct Data
{
public string sql;
}
[Serializable]
public struct Data
{
public string sql;
}
然后在客户端程序(假设为Client.exe)中引用ClassLib.dll,创建Data对象,给Data.sql赋值,再调用Serialize方法将Data对象序列化成字节数组发送出去。参考代码:
view plaincopy to clipboardprint?
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream mem = new MemoryStream();
ClassLib.Data data;
data.sql="select * from table";
formatter.Serialize(mem, data);
mem.Seek(0, SeekOrigin.Begin);
byte[] buffer = mem.GetBuffer(); //这里使用mem.GetBuffer()要比mem.ToArray()效率高,
//因为前者直接返回mem使用的内存,后者是创建一块合适大小的内存,
//再将mem对象缓存中的数据拷贝进去。
//但是如果改变使用GetBuffer方法返回的数组中数据的值,
//则mem对象缓存中的值也会变化
Send(buffer, mem.Length); //Send原型为 void Send(byte[] buf, long bufLen)
//之所以Send函数要有第2个参数bufLen,
//是因为使用GetBuffer方法返回的缓存中有未使用的字节
//通过给该参数传递mem.Length可以让Send函数只发送使用的字节
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream mem = new MemoryStream();
ClassLib.Data data;
data.sql="select * from table";
formatter.Serialize(mem, data);
mem.Seek(0, SeekOrigin.Begin);
byte[] buffer = mem.GetBuffer(); //这里使用mem.GetBuffer()要比mem.ToArray()效率高,
//因为前者直接返回mem使用的内存,后者是创建一块合适大小的内存,
//再将mem对象缓存中的数据拷贝进去。
//但是如果改变使用GetBuffer方法返回的数组中数据的值,
//则mem对象缓存中的值也会变化
Send(buffer, mem.Length); //Send原型为 void Send(byte[] buf, long bufLen)
//之所以Send函数要有第2个参数bufLen,
//是因为使用GetBuffer方法返回的缓存中有未使用的字节
//通过给该参数传递mem.Length可以让Send函数只发送使用的字节
在服务器端(假设为Server.exe)中也引用ClassLib.dll,调用Deserialize函数反序列化接收到的字节得到Data对象。参考代码:
view plaincopy to clipboardprint?
ClassLib.Data data = (ClassLib.Data)formatter.Deserialize(new MemoryStream(data, index, length));
ClassLib.Data data = (ClassLib.Data)formatter.Deserialize(new MemoryStream(data, index, length));
至此序列化和反序列化完成。今后在库变换时,只要保证服务器和客户端的库一致,就可以了。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/silverice/archive/2009/10/15/4674831.aspx
- 解决反序列化(Deserialize)无法找到程序集的错误
- 解决反序列化(Deserialize)无法找到程序集的错误
- 解决反序列化(Deserialize)无法找到程序集的错误
- 反序列化无法找到程序集
- 反序列化无法找到程序集
- 反序列化无法找到程序集
- 反序列化无法找到程序集(转载)
- C#反序列化无法找到程序集
- 序列化(Serialize)、反序列化(Deserialize)
- 序列化(Serialize)、反序列化(Deserialize)
- 解决gSOAP开发中的序列化和反序列化类型不匹配的问题(No Deserializer found to deserialize)
- C# Json反序列化 数据协定类型 无法反序列化 因为未找到必需的数据成员
- LeetCode 297. Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)
- 解决ASP.NET 请求数据太大500错误 JSON无法反序列化
- BinaryFormatter.Deserialize 不能反序列化其它Application或者assembly产生的序列化文件
- leetcode297:二叉树的序列化和反序列化(Serialize and Deserialize Binary Tree)
- 【二叉树】树的序列化和反序列化【449. Serialize and Deserialize BST】
- Tree-----297. Serialize and Deserialize Binary Tree(二叉树的序列化与反序列化)
- 报表中遇到的问题(三)
- 如何读取xml节点中的属性
- 基于Struts 2.x + Spring 2.x + Hibernate 3.x整合开发
- Linux设备驱动之《点亮一盏LED》
- java集合类(me)
- 解决反序列化(Deserialize)无法找到程序集的错误
- Bind和eval的区别
- 【搜索】【USACO】Overfencing
- 自绘按钮时的闪烁问题!不是在画按钮时的闪烁(无关双缓冲),而是不同按钮切换时的闪烁!
- ·····
- 1
- installanywhere打包j2ee(java、tomcat、mysql)的具体步骤
- 前台JS调用后台C#方法
- C#检测外键冲突的代码