2010-08-18 12 views
9

Tengo el siguiente código:¿Por qué me sale un error de serialización?

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; } 
} 

El código funciona bien y el llamado a GetObjFromXmlDocument produce una colección de listas. Sin embargo, siempre obtengo una excepción de primera oportunidad del tipo System.IO.FileNotFoundException en mscorlib.dll, cuando se ejecuta XmlSerializer serializer = new XmlSerializer(typeof(T));.

Así que entré en Debug/Exception y activé los Asistentes de depuración administrados. Tengo el siguiente en esa línea:

El montaje con 'mscorlib.XmlSerializers' nombre para mostrar no se pudo cargar en el 'LoadFrom' contexto del dominio de aplicación vinculante con ID 1. La causa de la falla fue: Sistema. IO.FileNotFoundException: No se pudo cargar el archivo o ensamblado 'mscorlib.XmlSerializers, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089' o una de sus dependencias. El sistema no puede encontrar el archivo especificado. Nombre del archivo: 'mscorlib.XmlSerializers, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089'

¿Puede alguien explicar por qué ocurre esto? ¿Hay algo que pueda hacer en la clase UserSetting para que el problema desaparezca? La aplicación es bastante sensible al rendimiento y prefiero no tener la excepción.

Respuesta

10

Microsoft says:

XmlSerializer intenta cargar serializadores pregeneradas para evitar compilación del código de serialización sobre la marcha. No hay una forma fácil de verificar "encontrará el ensamblado llamada Assembly.Load()", sería duplicando la búsqueda de ruta Fusion y lógica de cargador en XmlSerializer.

Se ve como una excepción FileNotFound se lanza y el tratamiento que XmlSerializer cuando el "pre-serializador generada" no se puede encontrar, lo cual provocará el código de serialización que se genere.

+2

Gracias, esto es muy útil! Más al respecto, si ve esto mientras depura, simplemente presione F5 y su programa continuará (no se bloqueará ... al menos no b/c de esto). –

2

Para los pocos proyectos de Visual Studio que tengo cuando sea una molestia, yo prefiero desactivar descanso en la excepción de sólo el BindingFailure y la System.IO.FileNotFoundException.

En Visual Studio: Ctl-D, Ctl-E para el diálogo Excepciones:

1) Desactive BindingFailure bajo administrados Asistentes de depuración

2) Deseleccionar System.IO.FileNotFoundException bajo Common Language Excepciones de tiempo de ejecución.

Ahhh eso es mejor :-)

Cuestiones relacionadas