C # XmlSerializer BindingFailure

Я получаю BindingFailure в строке кода с помощью XmlSerializer:

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

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

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

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

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

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


person Steve H.    schedule 05.02.2010    source источник
comment
Вы можете избежать того, чтобы среда выполнения создавала сборку сериализации на лету, предварительно запекая ее с помощью SGEN (однако это не самый забавный инструмент). Просто подумайте, хотя я не уверен, почему вы получаете эту ошибку.   -  person Nick Larsen    schedule 05.02.2010
comment
Как называется корневое пространство имен вашего проекта?   -  person SwDevMan81    schedule 05.02.2010
comment
Да, пространства имен разные. Поскольку я не хочу отдавать что-либо, что могло бы вызвать судебный иск, давайте просто скажем, что пространство имен приложения - это пространство имен 1, а сериализуемые объекты находятся в пространстве имен 2.   -  person Steve H.    schedule 05.02.2010
comment
Проверьте версию .NET вашего CustomXMLSerializeObject.XmlSerializers.dll, она должна быть такой же, как ваш проект. Проверьте это: stackoverflow.com/a/52848813/5639198   -  person Sashus    schedule 17.10.2018


Ответы (4)


Согласно Странная ошибка XmlSerializer < / а>:

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

Вероятно, это вызвано вашими исключениями, которые вы хотите отслеживать.

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

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

person SwDevMan81    schedule 05.02.2010
comment
Ле вздох ... Да, у меня он вообще ломается, когда их кидают в отладочных целях. Думаю, я просто разочарован тем, что обработка исключений используется в качестве замены потока управления. - person Steve H.; 05.02.2010
comment
Да, я столкнулся с этой проблемой некоторое время назад, когда запускал материал через Windbg и заметил эту ошибку. Это действительно должно быть простое исправление, но не похоже, что кто-то его исправил. Единственный обходной путь - отключить это исключение и дерьмовый обходной путь. - person SwDevMan81; 05.02.2010
comment
блин, нужно время, чтобы осознать, что пугающее ужасное сообщение - это просто ничто в конце концов. - person v.oddou; 11.10.2013
comment
Извините, но я просто не могу согласиться с отключением уведомлений, когда мне говорят, что что-то не так. Что, если уведомление не такое относительно безобидное, как это, но вызывает неожиданное поведение или даже иным образом необъяснимый сбой? Нет. Что должно произойти, так это выяснить, почему это происходит, и исправить это там, а не просто игнорировать это и надеяться, что все остальное будет в порядке. Смотрите мой ответ ниже. - person ouflak; 01.11.2013
comment
на основе ваших исключений, которые вы выбираете отслеживать. БУМ! Вот и все для меня. Тай! +1 - person ray; 07.07.2014

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

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

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

person Lin Song Yang    schedule 05.03.2014
comment
Хорошее решение, но что, если мне придется передать XmlSerializer массив дополнительных типов? Добавление сюда дополнительных типов просто создаст больше XmlSerializer и, конечно же, не будет включать дополнительные типы. - person Martin Braun; 03.08.2015
comment
Это было единственное решение, которое сработало для меня, но я не могу его понять. Кто-нибудь может объяснить мне, в чем разница между созданием XmlSerializer таким образом и созданием его экземпляра с новым синтаксисом, показанным в вопросе? - person EAmez; 31.03.2016
comment
@ al2suarez Мне был любопытен ваш комментарий, и я хотел указать на него цифры, если это правда. Я создал скрипт .Net здесь dotnetfiddle.net/LgwCkh, сравнивая два метода, и в среднем обнаружил, что создание сериализатора с использованием FromTypes примерно в 10 раз медленнее, чем использование конструктора. Если вы создаете много сериализаторов, это может быть проблемой. - person TJ Rockefeller; 07.04.2017

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

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

person Lucas B    schedule 31.05.2012

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

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

Перейдите в файлы 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))]

И не выключайте исключения! Я отправлю этот ответ на различные вопросы подобного рода.

person ouflak    schedule 31.10.2013
comment
Звучит многообещающе, но не работает, я все еще получаю System.IO.FileNotFoundException - person Grant; 06.11.2013
comment
Просто любопытно. Вы говорите, что ошибка BindingFailure исчезла, но теперь вы получаете исключение FileNotFoundException? Это тот же файл (или файлы), который был объявлен пропавшим без вести в BindingFailure? Если это так, я думаю, у вас должна быть ложная ссылка где-то все еще скрывающаяся, или есть что-то еще, скрытое в таинственной бездне вашего собрания, что неисследимо для нас, простых смертных, что этот сценарий не охватывает. - person ouflak; 06.11.2013