2010-08-17 42 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