签名程序集在SOAP反序列化上生成"应用程序已停止工作"

Gus*_*ori 2 c# crash serialization soap assemblies

我正在实例化一个对象,并使用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

在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处理程序,ISerParser serParser)

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

在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)

在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解串器.

我该如何解决这个问题?

Sim*_*ier 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的程序集序列化.这意味着在序列化时,此程序集没有强名称.

现在,如果您重新编译此程序集使用强名称对其进行签名,并在不更改序列化数据的情况下将其重新部署到原位,则程序集标识将不会被视为相同,并且反序列化代码将无法将其用于反序列化,因此错误.

用于序列化和反序列化的程序集必须具有相同的全名(至少使用您使用的格式化程序和绑定程序).

所以它可能是一个部署问题(确保序列化和反序列化程序集具有相同的全名),或者如果你真的需要能够处理具有不同全名的程序集(但这是不寻常的),你可以使用自定义绑定器,就像这里所做的那样:将数据反序列化为动态加载的程序集,尽管我不建议将其用于标准操作.