我遇到了xml-deserialization和动态加载程序集的问题。我将程序集直接从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的串行器/解串器?
答案 0 :(得分:1)
将zip加载到byte []中的是zip的byte []而不是程序集,首先解压缩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);
}
}
答案 1 :(得分:0)
我通过使用sgen为包含我想要序列化的类型的每个程序集创建序列化程序集(* .XmlSerializers.dll),并在我执行任何XmlSerialization
时将其包含在我的应用程序中。然后确保它们在运行时存在于bin路径中。 XmlSerialization探测* .XmlSerializers.dll并使用这些序列化类型,而不是在运行时创建它们。