代码之家  ›  专栏  ›  技术社区  ›  martin

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

  •  0
  • martin  · 技术社区  · 16 年前

    我在xml反序列化和动态加载程序集方面有问题。我直接将程序集从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 回复  |  直到 13 年前
        1
  •  1
  •   almog.ori    16 年前

    当你把一个zip加载到字节[]中时,得到的是zip的字节[],而不是程序集,先解压缩zip。你可以用 http://dotnetzip.codeplex.com ),一个免费的第三方库,用于创建和读取任何文件中的zip文件。NET应用程序。

       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);          
           }      
        }
    
        2
  •  0
  •   Wil P    16 年前

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