Десериализация XML с помощью динамически загружаемой сборки

У меня проблема с 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, но я очень недоволен этим. Есть ли лучшее решение, где я могу использовать общие списки? Или, если нет лучшего решения, есть ли лучший сериализатор/десериализатор для XML?


person martin    schedule 17.08.2010    source источник
comment
Когда я на днях пытался сериализовать объект, меня ругали за то, что у меня нет конструктора без параметров. Выполнение обратной операции может быть причиной проблемы здесь?   -  person brumScouse    schedule 17.08.2010


Ответы (2)


то, что вы получаете, когда загружаете почтовый индекс в байт [], является байтом [] почтового индекса, а не сборкой, сначала распакуйте почтовый индекс. Для создавать и читать 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);          
       }      
    }
person almog.ori    schedule 17.08.2010
comment
Я не загружаю zip как byte[], я загружаю dll из zip как byte[], используя SharpZipLib - person martin; 17.08.2010
comment
у вас есть тип модели, т.е. 1. можете ли вы дать образец кода, 2. какие атрибуты применяются? Вы используете методы преобразования xslt? на какие другие типы ссылается этот тип? вам, возможно, придется использовать другой ctor XmlSerializer для передачи известных типов... - person almog.ori; 18.08.2010

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

person Wil P    schedule 17.08.2010
comment
Проблема в том, что в bin-path не должно быть dll, специфичной для плагина. Мое намерение состоит в том, чтобы все вещи, специфичные для плагина, загружались напрямую из zip-файла. - person martin; 19.08.2010
comment
Можете ли вы создать сборки сериализации для ваших dll-плагинов и загрузить их одновременно с загрузкой dll-плагинов из zip-архива? - person Wil P; 19.08.2010
comment
Это возможно, я проверю это. - person martin; 14.09.2010