2011-10-24 39 views
2

我正在實例化一個對象,並使用SOAP數據填充它。已簽名的程序集在SOAP反序列化中生成「應用程序已停止工作」

這用於運作良好。

然而,給裝配強大的名字後,我發現了以下錯誤:

error window

重要的位是:

Application has stopped working

Problem Signature: System.Runtime.Serialization.Formatters.Soap

調試器顯示我System.Runtime.Serialization.SerializationException,具有以下細節。注意序列分析器

debugger

完整的錯誤描述爲 '與XML密鑰關聯的程序集' 如何抱怨:

Parse Error, no assembly associated with Xml key a1: http://schemas.microsoft.com/clr/nsassem/MyProject/MyProject%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull MainForm

這裏的堆棧跟蹤

at System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessGetType(String value, String xmlKey, String& assemblyString)

at System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessType(ParseRecord pr, ParseRecord objectPr)

at System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessAttributes(ParseRecord pr, ParseRecord objectPr)

at System.Runtime.Serialization.Formatters.Soap.SoapHandler.StartChildren()

at System.Runtime.Serialization.Formatters.Soap.SoapParser.ParseXml()

at System.Runtime.Serialization.Formatters.Soap.SoapParser.Run()

at System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler handler, ISerParser serParser)

at System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream, HeaderHandler handler)

at System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream)

at MyProject.Program.Main() in C:\MyProject\Program.cs:line 35

at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)

at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)

at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

at System.Threading.ThreadHelper.ThreadStart_Context(Object state)

at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)

at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

at System.Threading.ThreadHelper.ThreadStart()

我選中「簽署大會「,重建解決方案,並像魔術一樣,一切都恢復正常 - 所以,我知道一個糟糕的SOAP文件不是根本原因。事實上,如果我不得不冒險猜測,我會說強大的彙編名稱會使SOAP解串器「混淆」。

如何解決此問題?

+0

屏幕截圖發生什麼錯誤?從「解析錯誤...」開始 – sll

+0

@sll提供調用反序列化方法的入口點的完整路徑。我已編輯帖子以包含此信息。 –

回答

8

消息

Parse Error, no assembly associated with Xml key a1:http://schemas.microsoft.com/clr/nsassem/MyProject/MyProject%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull

指示數據已序列與具有公鑰設置爲空的組件。這意味着在序列化時,這個程序集沒有強名。

現在,如果您重新編譯此程序集使用強名稱對其進行簽名並在不改變序列化數據的情況下重新部署它,程序集標識將不會被視爲相同,並且反序列化代碼將無法將其用於反序列化,因此錯誤。

用於序列化和反序列化的程序集必須具有相同的全名(至少使用格式化程序和使用的聯編程序)。因此它可能是一個部署問題(確保反序列化程序集的序列化具有相同的全名),或者如果您確實需要能夠處理具有不同全名的程序集(但這是不常見的),則可以使用自定義聯編程序,就像這裏所做的那樣:Deserializing data into a dynamically loaded Assembly雖然我不會推薦它用於標準操作。

+0

感謝您的詳細信息。我前幾天得出了這個結論,但我想看到更多關於這個問題的信息。你的回答給了我額外的信息和我的解決方案的信心。 –