Исключение FileNotFound при использовании XmlSerializer

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

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

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

.сеть? вам следует добавить как можно больше тегов, относящихся к вашему вопросу.

Neil N 04.04.2009 00:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
4 172
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

Как я могу собрать такую ​​сборку и отправить ее? Не могли бы вы привести мне пример, как это сделать?

mrtaikandi 01.12.2008 11:25
Ответ принят как подходящий

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

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

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

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

Другие вопросы по теме