CSharp - xmlSerializer 在试图进行序列化类型,应用程序失败

  显示原文与译文双语对照的内容
0 0

试图序列化类型时,正在处理的应用程序失败。

这样一条语句


XmlSerializer lizer = new XmlSerializer(typeof(MyType));

生成:


System.IO.FileNotFoundException occurred
 Message="Could not load file or assembly '[Containing Assembly of MyType].XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified."
 Source="mscorlib"
 FileName="[Containing Assembly of MyType].XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
 FusionLog=""
 StackTrace:
 at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
 at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)

我没有为我的类定义任何特殊的序列化程序。

如何修复此问题?

时间: 原作者:

0 0

像 Martin Sherburn说,这是正常行为。 XmlSerializer的构造函数首先尝试查找名为 [YourAssembly] 。XmlSerializers 。dll的程序集,该程序集应该包含生成的类的序列化类。 由于还没有生成这样的DLL,所以抛出了 FileNotFoundException 。 当happenes时,xmlserializer的构造函数捕获该异常,并且在运行时由 xmlserializer ( 使用 C# compiler,这样做是你的计算机,然后对它的编译通过生成 C# 源 %temp% 目录中的文件,)的构造函数自动生成 DLL 。 对同一类型的XmlSerializer的额外构造将只使用已经生成的DLL 。

更新:从. NET 4.5开始,XmlSerializer 不再执行代码生成,也不会在运行时使用 C# 编译器进行编译,除非显式强制使用配置文件设置( useLegacySerializerGeneration ) 。 这里更改删除 csc.exe 上的依赖关系并提高启动性能。 源:.NET 框架 4.5自述文件,节 1.3.8.1.

这里异常由xmlserializer的构造函数处理。 没有必要自己做任何事情,只要点击'继续'( F5 ) 继续执行程序,一切都会好起来的。 如果你正在受到无谓的干扰这些异常停止了执行程序,并且突然弹出的FileNotFoundException异常 helper,要么你有'仅我的代码'关闭,或者你已经设置为当抛出,而不是当'user-unhandled'中断执行。

要启用'仅我的代码',转到工具>> 选项>> 调试>> 通用>> 仅启用我的代码。 在 System.IO. filenotfoundexception,要关闭执行引发FileNotFound时,请转到的破解调试>> 异常>> 找到>> 输入'FileNotFoundException'>> 取消勾选了'抛出'checkbox.

原作者:
0 0

有一个解决办法。 如果你使用


XmlSerializer lizer = XmlSerializer.FromTypes(new[] { typeof(MyType) })[0];

它应该避免这种情况。 在我这里可以正常工作。

0 0

为了避免异常,你需要执行两种操作:

  1. 将一个属性添加到序列化类( 我希望你可以访问)
  2. 使用 sgen.exe 生成序列化文件

将 System.Xml. Serialization.XmlSerializerAssembly 属性添加到类。 用'myassembly'所在的程序集的名称替换。


[Serializable]
[XmlSerializerAssembly("MyAssembly.XmlSerializers")]
public class MyClass
{
…
}

使用 sgen.exe 实用程序生成序列化文件并将它的部署到类的程序集。

'''MyAssembly.XmlSerializers.dll 。exe myassembly将生成文件

这两个更改将导致. NET 直接查找程序集。 我检查了它,它在. NET 框架 3.5上运行,Visual Studio 2008

0 0

我的解决方案是直接转到反射来创建序列化程序。 这将绕过导致异常的奇怪文件加载。 我将它打包在一个 helper 函数中,它也负责缓存序列化程序。


private static readonly Dictionary<Type,XmlSerializer> _xmlSerializerCache = new Dictionary<Type, XmlSerializer>();

public static XmlSerializer CreateDefaultXmlSerializer(Type type) 
{
 XmlSerializer serializer;
 if (_xmlSerializerCache.TryGetValue(type, out serializer))
 {
 return serializer;
 }
 else
 {
 var importer = new XmlReflectionImporter();
 var mapping = importer.ImportTypeMapping(type, null, null);
 serializer = new XmlSerializer(mapping);
 return _xmlSerializerCache[type] = serializer;
 }
}

原作者:
0 0

另一方面对编译错误进行疑难解答非常复杂。 这些问题在一个FileNotFoundException中显示:


File or assembly name abcdef.dll, or one of its dependencies, was not found. File name:"abcdef.dll"
 at System.Reflection.Assembly.nLoad(.. . )
 at System.Reflection.Assembly.InternalLoad(.. . )
 at System.Reflection.Assembly.Load(...)
 at System.CodeDom.Compiler.CompilerResults.get_CompiledAssembly()

你可能想知道一个文件没有找到的异常与实例化序列化程序对象有什么关系,但记住: 构造函数写入 C# 文件并尝试编译它们。 这个异常的调用堆栈提供了一些很好的信息来支持这个疑点。 当XmlSerializer试图加载由CodeDOM调用的程序集时,发生了异常调用 System.Reflection.Assembly.Load 方法。 异常没有提供解释为什么该XmlSerializer要创建的程序集不存在的解释。 通常,程序集不存在,因为编译失败,这可能是因为在极少数情况下,序列化属性生成 C# 编译器无法编译的代码。

注意 XmlSerializer时也会发生这里错误的一个帐户或者安全环境下运行,它不能够访问该临时目录。

: http://msdn.microsoft.com/en-us/library/aa302290.aspx

原作者:
0 0

serialise的自定义类:


[Serializable]
public class TestClass
{
 int x = 2;
 int y = 4;
 public TestClass(){}
 public TestClass(int x, int y)
 {
 this.x = x;
 this.y = y;
 }

 public int TestFunction()
 {
 return x + y;
 }
}

我已经附加了代码段。 也许这可以帮助你。


static void Main(string[] args)
{
 XmlSerializer xmlSerializer = new XmlSerializer(typeof(TestClass));

 MemoryStream memoryStream = new MemoryStream();
 XmlTextWriter xmlWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

 TestClass domain = new TestClass(10, 3);
 xmlSerializer.Serialize(xmlWriter, domain);
 memoryStream = (MemoryStream)xmlWriter.BaseStream;
 string xmlSerializedString = ConvertByteArray2Str(memoryStream.ToArray());

 TestClass xmlDomain = (TestClass)DeserializeObject(xmlSerializedString);

 Console.WriteLine(xmlDomain.TestFunction().ToString());
 Console.ReadLine();
}

原作者:
...