我正在实例化一个对象,并使用SOAP数据填充它。
这曾经很好用。
但是,在给了程序集一个强名后,我收到以下错误:
重要的一点是:
应用程序已停止工作
问题签名:System.Runtime.Serialization.Formatters.Soap
调试器向我显示System.Runtime.Serialization.SerializationException
,其中包含以下详细信息。请注意序列化解析器如何抱怨“没有与Xml键关联的程序集”
完整的错误说明是:
解析错误,没有与Xml键a1关联的程序集:http://schemas.microsoft.com/clr/nsassem/MyProject/MyProject%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull MainForm
这是StackTrace
at System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessGetType(String value,String xmlKey,String& assemblyString)
在System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessType(ParseRecord pr,ParseRecord objectPr)
在System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessAttributes(ParseRecord pr,ParseRecord objectPr)
在System.Runtime.Serialization.Formatters.Soap.SoapHandler.StartChildren()
在System.Runtime.Serialization.Formatters.Soap.SoapParser.ParseXml()
在System.Runtime.Serialization.Formatters.Soap.SoapParser.Run()
在System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler handler,ISerParser serParser)
在System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream,HeaderHandler handler)
at System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream)
在C:\ MyProject \ Program.cs中的MyProject.Program.Main():第35行
在System.AppDomain._nExecuteAssembly(RuntimeAssembly程序集,String [] args)
在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean ignoreSyncCtx)
在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)
在System.Threading.ThreadHelper.ThreadStart()
我取消选中“签署程序集”,重新构建解决方案,就像魔术一样,一切都恢复正常 - 所以,我知道一个错误的SOAP文件不是根本原因。事实上,如果我不得不猜测,我会说强大的程序集名称“令人困惑”的SOAP解串器。
如何解决此问题?
答案 0 :(得分:8)
消息
解析错误,没有与Xml密钥关联的程序集 A1:HTTP://schemas.microsoft.com/clr/nsassem/MyProject/MyProject%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull
表示数据已使用将PublicKeyToken设置为null的程序集序列化。这意味着在序列化时,此程序集没有强名称。
现在,如果您重新编译此程序集使用强名称对其进行签名,并在不更改序列化数据的情况下将其重新部署到原位,则程序集标识将不会被视为相同,并且反序列化代码将无法将其用于反序列化因此错误。
用于序列化和反序列化的程序集必须具有相同的全名(至少使用您使用的格式化程序和绑定程序)。
所以它可能是一个部署问题(确保序列化和反序列化程序集具有相同的全名),或者如果你真的需要能够处理具有不同全名的程序集(但这是不寻常的),你可以使用一个自定义绑定器,就像在这里完成的那样:Deserializing data into a dynamically loaded Assembly虽然我不推荐它用于标准操作。