Десериализация XML с динамически загружаемой сборкой - PullRequest
0 голосов
/ 17 августа 2010

У меня проблема с xml-десериализацией и динамически загружаемыми сборками.Я загружаю свою сборку прямо из zip-файла в байтовый массив.Затем я загружаю эту сборку.Сборка содержит модель данных, которая должна быть десериализована с помощью XmlSerializer.Проблема в том, что я всегда получаю TypeInitializationException, если я пытаюсь загрузить свой 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 напрямую изdll-файл, а не из zip-файла в байтовый массив, XML может быть успешно десериализован.

В интернете я обнаружил, что проблема может быть в списках с собственными типами, но в решениях, которые я нашелне удалось решить мою проблему.

РЕДАКТИРОВАТЬ:

Я обнаружил, что не могу использовать универсальные списки с собственными типами, если я загружаю сборку черезбайтовый массив, как написано на другом сайте.Я не мог сказать, почему у меня сначала не было успеха с этими решениями, но после второй попытки это работает.Я сделал обходной путь с ArrayList, но я очень недоволен этим.Есть ли лучшее решение, где я могу использовать общие списки?Или, если нет лучшего решения, есть ли лучший Serializer / Deserializer для XML?

Ответы [ 2 ]

1 голос
/ 17 августа 2010

то, что вы получаете, когда загружаете 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);          
       }      
    }
0 голосов
/ 17 августа 2010

Я справился с этим, используя sgen для создания сборок сериализации (* .XmlSerializers.dll) для каждой сборки, содержащей типы, которые я хочу сериализовать, и добавляя их в свое приложение всякий раз, когда я делаю XmlSerialization. Затем убедитесь, что они существуют в пути вашего бина во время выполнения. XmlSerialization проверяет * .XmlSerializers.dll и использует эти типы сериализации вместо их создания во время выполнения.

...