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





XmlSerializer работает, генерируя код для сериализации / десериализации и сохраняя его во временной сборке. (Этот подход дает хорошую производительность для повторной сериализации / десериализации, но (традиционно) ужасно ужасную производительность для первого запуска)
Чтобы уменьшить шокирующую производительность, начиная с VS2005 (и ранее с использованием менее известных методов), вы можете явно создать сборку сериализации во время сборки и отправить ее вместе с основной сборкой.
Если вы не создаете / отправляете сборку сериализации, тогда фреймворк имеет тенденцию генерировать исключение, когда ищет его, хотя обычно он перехватывает исключение, строит сборку на лету и продолжает работу. Если вы работаете под отладчиком, но с установленным параметром «break-on-throw», может быть немного тревожно, если исключение FileNotFound выбрасывается глубоко в недра фреймворка.
Вы Конечно, что исключение FileNotFound напрямую связано с ошибкой сериализации, которую вы наблюдаете? Вы пробовали явно включить сборку сериализации?
Как я могу собрать такую сборку и отправить ее? Не могли бы вы привести мне пример, как это сделать?
Если вы строите с помощью 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.
.сеть? вам следует добавить как можно больше тегов, относящихся к вашему вопросу.