Почему я получаю ошибку сериализации? - PullRequest
9 голосов
/ 19 августа 2010

У меня есть следующий код:

class Program
{
    static void Main(string[] args)
    {
        string xml = @"<ArrayOfUserSetting>
                            <UserSetting>
                                <Value>Proposals</Value>
                                <Name>LastGroup</Name>
                            </UserSetting>
                            <UserSetting>
                                <Value>Visible</Value>
                                <Name>WidgetsVisibility</Name>
                            </UserSetting>
                        </ArrayOfUserSetting>";

        List<UserSetting> settings = 
                 GetObjFromXmlDocument<List<UserSetting>>(xml);
    }

    public static T GetObjFromXmlDocument<T>(string xml)
    {
        T customType;

        XmlSerializer serializer = new XmlSerializer(typeof(T));

        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(xml);
        using (XmlNodeReader xmlNodeReader = new XmlNodeReader(xmlDocument))
        {
            customType = (T)serializer.Deserialize(xmlNodeReader);
        }

        return customType;
    }
}

[Serializable]
public class UserSetting
{
    public string Value { get; set; }
    public string Name { get; set; }
}

Код работает нормально, и вызов GetObjFromXmlDocument выдает коллекцию List. Тем не менее, я всегда получаю первое случайное исключение типа System.IO.FileNotFoundException в mscorlib.dll, когда выполняется XmlSerializer serializer = new XmlSerializer(typeof(T));.

Итак, я вошел в Debug / Exception и включил Managed Debugging Assistants. В этой строке я получил следующее:

Сборка с отображаемым именем «mscorlib.XmlSerializers» не удалось загрузить в контексте привязки «LoadFrom» AppDomain с идентификатором 1. Причина сбоя: System.IO.FileNotFoundException: не удалось загрузить файл или сборку ' mscorlib.XmlSerializers, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089 'или одна из ее зависимостей. Система не может найти указанный файл. Имя файла: 'mscorlib.XmlSerializers, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089'

Может кто-нибудь объяснить, почему это происходит? Что я могу сделать с классом UserSetting, чтобы проблема исчезла? Приложение очень чувствительно к производительности, и я бы не стал исключением.

Ответы [ 2 ]

10 голосов
/ 19 августа 2010

Microsoft говорит :

XmlSerializer пытается загрузить предварительно сгенерированные сериализаторы, чтобы избежать составление кода сериализации на лету. Там нет простого способа проверить, будет ли сборка найдена вызов Assembly.Load () ", это было бы Дублирование поиска пути Fusion и Логика загрузчика в XmlSerializer.

Похоже, что исключение FileNotFound генерируется и обрабатывается в XmlSerializer, когда «предварительно сгенерированный сериализатор» не может быть найден, что приведет к генерации кода сериализации.

2 голосов
/ 21 июня 2014

Для избранных проектов Visual Studio, которые у меня есть, где это раздражает, я предпочитаю отключать разрыв при исключении только для BindingFailure и System.IO.FileNotFoundException .

В Visual Studio: Ctl-D, Ctl-E для диалогового окна «Исключения»:

1) Снимите флажок BindingFailure в Помощники по управляемой отладке

2) Снимите флажок System.IO.FileNotFoundException в Общеязыковые исключения времени выполнения .

Ааа, так лучше: -)

...