2008-11-30 2 views
2

При попытке сериализовать тип (общий List<T> которой Т является класс помеченный XmlRootAttribute) в XML с помощью XmlSerializer, FileNotFoundException брошено (иногда) и сериализации терпит неудачу.FileNotFound исключение при использовании XmlSerializer

Похоже, что XmlSerializer пытается создать временный файл со случайным именем файла в папке Temp пользователя, в которой работает приложение, но файл каким-то образом удаляется.

Кто-нибудь это видел? Любые обходные пути?

+0

.net? вы должны добавить как можно больше тегов, которые относятся к вашему вопросу. – 2009-04-03 20:22:00

+0

Как много _useful_ тегов. – 2009-09-04 20:32:44

ответ

2

Если вы строите с помощью Visual Studio, в свойствах проекта есть интересный вариант. На вкладке «Строй-Строй» вы можете выбрать «Создать ассемблер сериализации» («Да», «Нет», «Авто»). Если я правильно помню, мне не удалось создать эту сборку с помощью «Да», чтобы избавиться от этого исключения. Но как только у меня сложилось впечатление, что установка опции «Нет» привела сборку, чтобы не пытаться найти такую ​​сборку, поэтому больше не было разочарованного FileNotFound-Exception. В любом случае, как вы уже сказали, исключение - скорее косметологическая проблема. Вы можете подумать о его подавлении (настроить через Debug/Exceptions ... в Visual Studio), по крайней мере, в том случае, если он обрабатывается.

редактировать: The option is only evaluated under certain circumstances, for a final solution see this question (and its answers)

2

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

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

Если вы сделать не создать/корабль сборку сериализации, то структура имеет тенденцию бросить исключение, когда он ищет его, хотя обычно он ловит исключение, строит сборку на лету, и уживается с вещи. Если вы работаете под отладчиком, но с настройкой «break-on-throw», это может быть немного тревожным, чтобы исключение FileNotFound было заброшено глубоко в недрах фреймворка.

Вы уверены, что исключение FileNotFound напрямую связано с неудачей сериализации, которую вы видите? Вы пытались включить сборку сериализации явно?

0

Последняя возможность здесь в том, что существует большая в XML сериализации выполнения. Они были более распространены много лет назад, но, возможно, их все еще мало. Что может произойти, если вы имеете совершенно законную разметку XML Serialization на вашем C# или VB (или другом) коде, создание XmlSerializer для этого типа приведет к созданию нелегального кода для сборки JIT-скомпилированной сериализации. Компиляция задохнется и умрет, а затем загрузка сборки бросит. Обычно с именем файла rfuieuy267.dll или что-то подобное.

И было тайное заклинание, которое вы могли бы сказать, чтобы сообщить движку XmlSerialization о сохранении созданного им кода .cs, но я не помню, что это сейчас. Он не был задокументирован; Я узнал об этом только при работе с MS Engineers, отлаживающей одну из этих проблем. Но я готов поспорить, что вы можете найти его в googlespace.

Смежные вопросы