Dynamic Assembly的序列化和反序列化
原来又申请过博客,不过总是不能坚持到底,所以一直很崇拜那些更新频率很高的博主,真的很佩服。
有的时候心想,自己是不是缺少了点什么东西呢?例如:耐力,恒心?
呵呵,不过不管怎么样,我还是决定重拾我的技术博客,要求不高,就权当自己的工作笔记整理好了,反正现在也不像以前那么繁杂的事情,大可以抽些时间出来写写工作日记的。
啰嗦过了,权当拜山。
-----------------------无敌超级分割线--------------------------
今天记录的是一个动态程序集的反序列化的问题。事情的起因是这样的。
程序中用到了Emit动态生成类,这个类使生成了一些特殊的属性以方便在表格的绑定。本来使用的好好的,但是有一个需求……需要将该类做深复制,我采用的是序列化和反序列化的方法,但是问题出来了。
首先是在序列化的时候出的问题:
ExtendedStudent 没有标记为可序列化。
这个好搞,TypeBuilder.SetCustomAttribute(new CustomAttributeBuilder(typeof(SerializableAttribute), new Type[]{ })) 就搞定了。
然后,反序列化,真正的问题出现了、
无法加载ExtentedTypes.ExtendedStudent类。
嗯哼,我是动态生成的类,当然是找不到文件了,不在BIN目录,不在当前目录,不在GAC,能去哪儿找呢?
怎么解决呢?首先想到的是,用RunAndSave把该程序集保存下来,然后再去调用,应该是没有问题。可是在我调用AssemblyBuilder.Save的时候得到的DLL文件却始终只有2K,用Reflector打开什么也没有……放弃。
再想到,为什么我可以使用LoadAssembly却不能加载呢?纠结中……看起来好像是Framework的Bug或者的缺陷?难道要放弃?
打开.Net Framework代码调试,显示调用方法为LoadAssemblyNoThrow方法,忽然想到AppDomain有一个事件就是用来处理找不到程序集的。马上试试。
static DataSourceHelper()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name == assBuilder.FullName)
return assBuilder;
return null;
}
呵呵,欧拉~ 想破了头也没有解决的问题居然解决的如此轻松,真的是让人大跌眼镜。 AssemblyResolve MSDN: http://msdn.microsoft.com/zh-cn/system.appdomain.assemblyresolve(en-us,VS.71).aspx
-----------------------------------------------------
总结:要多熟悉Framework个命名空间下的各个类,甚至各类下的方法事件属性等,特别是比较生僻的那种,很有可能某个时候就会就你一命哦!
还有,当遇到问题的时候不要往某一个地方削尖了脑袋钻,换个方式,也许会柳暗花明。
posted on 2010-01-08 22:06 NullReference 阅读(1399) 评论(1) 编辑 收藏 举报