2010-08-17 68 views
0

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

例外的是以下(德国):

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文件从zip加载我的DLL,而不是到一个字节数组中,XML可以成功地反序列化。

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

编辑:

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

+0

当我在前些日子试图连载一个物体时,我因为没有一个没有参数的consructor而发牢骚。执行逆向操作可能会导致这里的问题? – brumScouse 2010-08-17 19:13:34

回答

0

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

+0

问题是在bin路径中不应该有一个插件specific-dll。我的意图是,所有插件特定的东西都直接从zip文件加载。 – martin 2010-08-19 06:56:29

+0

你可以为你的插件DLL创建序列化程序集,并在你从zip加载插件DLL的同时加载它们吗? – 2010-08-19 14:14:46

+0

这可能是可能的,我会检查这一点。我使用SharpZipLib – martin 2010-09-14 14:37:30

1

当你将一个zip加载到一个byte []时,你得到的是zip的一个字节[]而不是程序集,首先解压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);   
     }  
    } 
+0

您是否拥有模型类型,即1.您可以提供代码示例,2.应用了哪些属性?你使用xslt变换技术吗?该类型引用了哪些其他类型?您可能不得不使用XmlSerializer的其他控制器来传递已知类型... – 2010-08-17 20:17:21