2010-08-18 3 views
9

У меня есть следующий код:Почему я получаю ошибку сериализации?

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 и включил помощников по управлению отладкой. Я получил следующее по этой линии:

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

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

ответ

10

Microsoft says:

XmlSerializer пытается загрузить предварительно сгенерированные сериализаторы избежать компиляции кода сериализации на лету. Существует нет простого способа для проверить на наличие «сборки» . Assembly.Load() call », это будет , дублирующий поиск путей Fusion и логику загрузчика в XmlSerializer.

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

+2

Спасибо, это очень полезно! Подробнее об этом, если вы видите это во время отладки, просто нажмите F5, и ваша программа продолжит движение (это не сбой ... по крайней мере, не b/c этого). –

2

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

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

1) Снимите флажок BindingFailure под Managed Отладка ассистентов

2) Снимите флажок System.IO.FileNotFoundException под Common Language Исключения Runtime.

Ahhh, что лучше :-)

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