【问题标题】:Serialization Exception in .NET 4.5.NET 4.5 中的序列化异常
【发布时间】:2013-03-28 22:27:07
【问题描述】:

我在调用时得到这个堆栈跟踪:

XslCompiledTransform.Transform(XmlDocument.DocumentElement.CreateNavigator(), null, StringWriter)


System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize ---> System.Runtime.Serialization.SerializationException: Type is not resolved for member --MyProject stuff
   at System.AppDomain.GetHostEvidence(Type type)
   at System.Security.Policy.AppDomainEvidenceFactory.GenerateEvidence(Type evidenceType)
   at System.Security.Policy.Evidence.GenerateHostEvidence(Type type, Boolean hostCanGenerate)
   at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
   at System.Security.Policy.Evidence.RawEvidenceEnumerator.MoveNext()
   at System.Security.Policy.Evidence.EvidenceEnumerator.MoveNext()
   at System.Configuration.ClientConfigPaths.GetEvidenceInfo(AppDomain appDomain, String exePath, String& typeName)
   at System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix(AppDomain appDomain, String exePath)
   at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
   at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)
   at System.Configuration.ClientConfigurationHost.get_HasRoamingConfig()
   at System.Configuration.ClientConfigurationHost.IsConfigRecordRequired(String configPath)
   at System.Configuration.BaseConfigurationRecord.hlNeedsChildFor(String configName)
   at System.Configuration.Internal.InternalConfigRoot.GetConfigRecord(String configPath)
   at System.Configuration.ClientConfigurationSystem.OnConfigRemoved(Object sender, InternalConfigEventArgs e)
   --- End of inner exception stack trace ---
   at System.Configuration.ConfigurationManager.PrepareConfigSystem()
   at System.Configuration.ConfigurationManager.GetSection(String sectionName)
   at System.Xml.XmlConfiguration.XmlReaderSection.get_ProhibitDefaultUrlResolver()
   at System.Xml.XmlTextReaderImpl.get_IsResolverNull()
   at System.Xml.Xsl.QueryReaderSettings..ctor(XmlReader reader)
   at System.Xml.Xsl.Xslt.XsltLoader.Load(Compiler compiler, Object stylesheet, XmlResolver xmlResolver)
   at System.Xml.Xsl.Xslt.Compiler.Compile(Object stylesheet, XmlResolver xmlResolver, QilExpression& qil)
   at System.Xml.Xsl.XslCompiledTransform.LoadInternal(Object stylesheet, XsltSettings settings, XmlResolver stylesheetResolver)
   at System.Xml.Xsl.XslCompiledTransform.Load(XmlReader stylesheet, XsltSettings settings, XmlResolver stylesheetResolver)
   at MyProject

XslCompiledTransform 对象将使用 GetManifestResourceStream 的 XmlReader 加载到嵌入的 .xslt 文件中,但我已确认它正确获取了该信息。

我已经看了很多,并将其缩小到这个电话,但我不知道从这里去哪里。有其他人经历过吗?

这是在 Windows 8 机器上,但我在 server2008r2 操作系统上体验过

【问题讨论】:

  • 您是否有机会在自定义 AppDomain 中运行您的代码并使用自定义 Principal?

标签: serialization xml-serialization .net-4.5


【解决方案1】:

我在使用 .NET 4.5 时遇到了同样的错误。我只在使用 nunit 2.6+ 时看到错误。当您在子 AppDomain 中使用存储在 CallContext 中的对象初始化 XmlSerializer 时,似乎会发生这种情况。如果在子 AppDomain 中将 ApplicationBase(bin 路径)设置为不同的值,则无法解析 CallContext 中的对象类型。您可以在 Fusion Log Viewer 中看到程序集绑定错误:http://msdn.microsoft.com/en-us/library/e74a18c4.aspx

在我的例子中,如果我将包含类型的程序集复制到 nunits bin-path,错误就会消失。这当然不是一个可行的解决方案。

您找到错误的根本原因了吗?

编辑:我通过让类型继承 MarshalByRefObject 来修复它:Type cant be resolve in UnitTest after migrating Project from vs2005 to vs2010 (MSTest)

编辑 2:替代解决方法是在代码失败之前调用 System.Configuration.ConfigurationManager.GetSection("dummy")。

【讨论】:

  • 在我刚才的例子中,它是(根据@MikeGoatly 昨天的评论)与CallContext 关联的主体。我的解决方法是将Thread.CurrentPrincipal 保护到一个局部变量中,然后在编译Xsl 转换时为其分配一个new ClaimsPrincipal()。 (然后再将其还原)
  • @Andreas Kromann,您能解释一下为什么调用ConfigurationManager.GetSection() 可以解决问题吗?我试过了,它有效,但我无法解释。
  • 我在运行 MSTest (v4.0) 时遇到了 {"Configuration system failed to initialize"} 的运行时错误,并且成员 XXXX 的类型未解析。我将 System.Configuration.ConfigurationManager.GetSection("dummy") 添加到 [TestInitialize] 中,现在它正在工作。我也想知道为什么。
  • 认为这就是为什么 Fix (2) 起作用的解释:它在其他之前提示应用配置解析(查找应用配置文件,与机器配置合并等)应用程序代码(以及 log4net 等库)有机会在 CallContext 中放置任何内容。否则,如果稍后完成应用程序配置解析,System.Configuration.ClientConfigPaths 可以调用 System.AppDomain.Evidence,它可以跨应用程序域......并且当 CallContext 被复制时,如果某些内容没有从 MarshalByRefObject 继承,则序列化/类型会出现分辨率错误。
猜你喜欢
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多