C # XmlSerializer BindingFailure - PullRequest
       30

C # XmlSerializer BindingFailure

45 голосов
/ 05 февраля 2010

Я получаю BindingFailure для строки кода, используя XmlSerializer:

XmlSerializer s = new XmlSerializer(typeof(CustomXMLSerializeObject));

Сборка с отображаемым именем CustomXMLSerializeObject.XmlSerializers 'не удалось загрузить в контексте привязки «LoadFrom» AppDomain с идентификатором 1. Причина сбоя: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку XMLSerializeObject. XmlSerializer, версия = 1.4.0.0, Culture = нейтральный, PublicKeyToken = null 'или одна из его зависимостей. Система не может найти указанный файл.

Ошибка довольно длинная и продолжает объяснять информацию о состоянии предварительной привязки и места, в которых она пыталась найти файл.

Пользовательский объект, который я пытаюсь десериализовать, относительно прост - просто набор частных целых чисел и строк, которые имеют публичные средства доступа. У меня есть личная переменная, которая является другим настраиваемым сериализуемым классом, но в ней нет ничего, кроме частных строк с открытыми средствами доступа.

Неловкая часть? Это происходит только тогда, когда я десериализую. Эта строка кода работает нормально, когда я сериализую объект. Он отлично работает, и объект десериализуется и заполняется идеально. Не замечайте потери производительности или продолжительного времени загрузки.

Что именно это предупреждение (не ошибка или исключение, программа работает нормально после этого)? Почему это происходит? Как я могу предотвратить это без простого отключения предупреждения?

Ответы [ 4 ]

57 голосов
/ 05 февраля 2010

По Странная ошибка XmlSerializer :

Это исключение является частью Нормальная работа XmlSerializer. Это ожидается и будет пойман и обрабатывается внутри кода Framework. Просто игнорируй это и продолжай. Если оно беспокоит вас во время отладки, установите Отладчик Visual Studio только для остановки необработанные исключения вместо всех исключения.

Вероятно, это вызвано вашими исключениями, которые вы выбираете для мониторинга.

Подскажите, как настроены ваши исключения: Отладка -> Исключения

Если снять флажок «Брошено» для BindingFailure в «Помощниках по управляемой отладке», исключение должно исчезнуть. Или, если вы не хотите этого делать, вы можете просто продолжить, так как это исключение сделано

39 голосов
/ 05 марта 2014

Используйте следующий метод для создания экземпляра xmlSerializer, чтобы решить проблему:

XmlSerializer s = XmlSerializer.FromTypes(new[] { typeof(CustomXMLSerializeObject) })[0];

тогда вам не нужно отключать обработку исключений.

4 голосов
/ 31 мая 2012

Согласно MS VS 2010 Feedback , как это было разработано. Чтобы предотвратить это исключение и предотвратить замедление во время выполнения, вам нужно сгенерировать сборку XML Serializer.

Я могу найти три инструмента: Microsoft SGen , XGenPlus и Mvp.Xml.XGen . На данный момент, к сожалению, ни один из них не обновлялся с 2007 года.

0 голосов
/ 31 октября 2013

Хорошо, я нашел решение. Я никогда не мог принять отключение исключений в качестве ответа. Просто кажется как-то не так ....

Похоже, что в предыдущих сборках или в предыдущих версиях вашей текущей сборки некоторые ссылки использовались извне. Несмотря на то, что ваш код уже давно отказался от этих ссылок, имена все еще, где-то загадочные, ищут в сборке.

Перейдите к файлам AssemblyInfo.cs и найдите ThemeInfo:

[assembly: ThemeInfo(
ResourceDictionaryLocation.ExternalAssembly, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page, 
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries))]

Изменить первое местоположение на «Нет»:

[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page, 
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries))]

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

...