使用动态加载的程序集反序列化XML

时间:2010-08-17 19:03:31

标签: c# xml serialization assemblies

我遇到了xml-deserialization和动态加载程序集的问题。我将程序集直接从zip文件加载到字节数组。然后我加载这个程序集。程序集包含一个数据模型,应该使用XmlSerializer进行反序列化。 问题是,如果我尝试加载XML,我总是得到一个TypeInitializationException。

例外情况如下(德语):

System.InvalidOperationException: Fehler im XML-Dokument (62,13). ---> 
   System.TypeInitializationException: Der Typeninitialisierer für 
   "Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderOrder" hat eine 
   Ausnahme verursacht. ---> System.NullReferenceException: Der Objektverweis wurde 
   nicht auf eine Objektinstanz festgelegt.
   bei Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderOrder..cctor()

如果我直接从dll文件加载我的dll,而不是从zip加载到字节数组,那么XML可以成功地反序列化。

我发现互联网,问题可能是列表中有自己的类型,但我找到的解决方案并没有解决我的问题。

修改

我发现如果我通过字节数组加载程序集,我就无法使用自有类型的通用列表,因为它是在其他网站上编写的。我不能说,为什么我第一次没有成功使用这个解决方案,但经过第二次尝试它的确有效。我已经使用ArrayList做了一个解决方法,但我对此非常不满意。有没有更好的解决方案,我可以使用通用列表?或者,如果没有更好的解决方案,是否有更好的用于XML的串行器/解串器?

2 个答案:

答案 0 :(得分:1)

将zip加载到byte []中的是zip的byte []而不是程序集,首先解压缩zip。您可以使用http://dotnetzip.codeplex.com这样的免费第三方库来创建和读取任何.NET应用程序中的zip文件。 。 。

   string unpackDirectory = "ExtractedFiles";      
   using (ZipFile zip1 = ZipFile.Read(zipToUnpack))      
   {
       // here, we extract every entry, but we could extract conditionally          
       // based on entry name, size, date, checkbox status, etc.            
       foreach (ZipEntry e in zip1)          
       {            
           e.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently);          
       }      
    }

答案 1 :(得分:0)

我通过使用sgen为包含我想要序列化的类型的每个程序集创建序列化程序集(* .XmlSerializers.dll),并在我执行任何XmlSerialization时将其包含在我的应用程序中。然后确保它们在运行时存在于bin路径中。 XmlSerialization探测* .XmlSerializers.dll并使用这些序列化类型,而不是在运行时创建它们。