Подписанная сборка генерирует сообщение «Приложение перестало работать» при десериализации SOAP

#c# #serialization #soap #crash #assemblies

#c# #сериализация #soap #авария #сборки

Вопрос:

Я создаю экземпляр объекта и заполняю его, используя данные SOAP.

Раньше это работало хорошо.

Однако после присвоения сборке строгого имени я получаю следующую ошибку:

окно ошибки

Важные биты, которые:

Приложение перестало работать

Сигнатура проблемы: System.Runtime.Сериализация.Форматирование.Soap

Отладчик показывает мне a System.Runtime.Serialization.SerializationException со следующими подробностями. Обратите внимание, как анализатор сериализации жалуется на «отсутствие сборки, связанной с Xml-ключом»

отладчик

Полное описание ошибки:

Ошибка синтаксического анализа, нет сборки, связанной с Xml-ключом a1:http://schemas.microsoft.com/clr/nsassem/MyProject/MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken% Основная форма 3Dnull

Вот трассировка стека

в System.Runtime.Сериализация.Formatters.Soap.SOAPHandler .ProcessGetType(строковое значение, строка xmlKey, строка amp; assemblyString)

в System.Runtime.Сериализация.Formatters.Soap.SOAPHandler .ProcessType(ParseRecord pr, ParseRecord objectPr)

в System.Runtime.Сериализация.Formatters.Soap.SOAPHandler .Атрибуты процесса (ParseRecord pr, ParseRecord objectPr)

в System.Runtime.Сериализация.Formatters.Soap.SOAPHandler .StartChildren()

в System.Runtime.Сериализация.Formatters.Soap.SoapParser.parseXML()

в System.Runtime.Сериализация.Formatters.Soap.SoapParser.Run()

в System.Runtime.Сериализация.Formatters.Soap.ObjectReader .Десериализация (обработчик HeaderHandler, ISerParser serParser)

в System.Runtime.Сериализация.Formatters.Soap.SoapFormatter.Десериализация (поток serializationStream, обработчик HeaderHandler)

в System.Runtime.Сериализация.Formatters.Soap.SoapFormatter.Десериализация (поток serializationStream)

в MyProject.Program.Main() в C:MyProjectProgram.cs:line 35

в системе.AppDomain._nExecuteAssembly(сборка RuntimeAssembly, аргументы String[])

в системе.AppDomain .ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] аргументы)

в Microsoft.VisualStudio.Процесс хостинга.HostProc.RunUsersAssembly()

в системе.Многопоточность.ThreadHelper.ThreadStart_Context (состояние объекта)

в системе.Многопоточность.ExecutionContext.Run(ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта, логическое игнорирование SyncCtx)

в системе.Многопоточность.ExecutionContext.Run(ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта)

в системе.Многопоточность.ThreadHelper.ThreadStart()

Я снял флажок «Подписать сборку», перестроил решение, и, как по волшебству, все вернулось к нормальной жизни — итак, я знаю, что плохой файл SOAP не является основной причиной. На самом деле, если бы мне пришлось рискнуть предположить, я бы сказал, что строгое имя сборки «сбивает с толку» десериализатор SOAP.

Как мне устранить эту проблему?

Комментарии:

1. О какой ошибке говорится на скриншоте? Начиная с «Ошибка синтаксического анализа …»

2. @sll предоставляет полный путь к точке входа, которая вызывает метод десериализации. Я отредактировал сообщение, чтобы включить эту информацию.

Ответ №1:

Сообщение

Ошибка синтаксического анализа, сборка не связана с Xml-ключом a1:http://schemas.microsoft.com/clr/nsassem/MyProject/MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

указывает, что данные были сериализованы с помощью сборки, для которой PublicKeyToken установлено значение null. Это означает, что во время сериализации у этой сборки не было строгого имени.

Теперь, если вы перекомпилируете эту сборку, подпишите ее, используя строгое имя, и повторно развернете ее на месте без изменения сериализованных данных, идентификатор сборки не будет считаться тем же, и код десериализации не сможет использовать его для десериализации, отсюда и ошибка.

Сборки, используемые для сериализации и десериализации, должны иметь одно и то же полное имя (по крайней мере, с форматированием и связующим, которое вы используете).

Так что это может быть проблемой развертывания (убедитесь, что сериализация и десериализация сборок имеют одинаковое полное имя), или, если вам действительно нужно иметь возможность работать со сборками с разными полными именами (но это необычно), вы можете использовать пользовательский связующий, например, то, что сделано здесь: десериализация данных вдинамически загружаемая сборка, хотя я бы не рекомендовал ее для стандартных операций.

Комментарии:

1. Спасибо за подробности. Я пришел к такому выводу несколько дней назад, но я хотел бы узнать немного больше об этой проблеме. Ваш ответ дал мне дополнительную информацию и уверенность в моем решении.