#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. Спасибо за подробности. Я пришел к такому выводу несколько дней назад, но я хотел бы узнать немного больше об этой проблеме. Ваш ответ дал мне дополнительную информацию и уверенность в моем решении.