FileNotFound исключение при использовании XmlSerializer - PullRequest
2 голосов
/ 30 ноября 2008

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

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

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

Ответы [ 3 ]

2 голосов
/ 04 апреля 2009

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

edit: Опция оценивается только при определенных обстоятельствах, для окончательного решения см. Этот вопрос (и его ответы)

2 голосов
/ 30 ноября 2008

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

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

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

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

0 голосов
/ 05 апреля 2009

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

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

...