NullReference

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
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  阅读(1394)  评论(1编辑  收藏  举报