none
Problema al deserializar una lista xml RRS feed

  • Pregunta

  • Hola.
    Tengo un problema a la hora de deserializar una lista xml. En algunas ocasionas todo funciona correctamente, pero en otras me salta una excepción en la línea que pongo "AQUÍ ESTÁ EL PROBLEMA".
    La excepción es esta:
    InvalidOperationException Was unhandled
    There is an error in XML document (4,17).
    ¿Qué esta ocurriendo? ¿Cómo puedo solucionarlo?
    Gracias de antemano
     
        public static void serializar(object o)
        {
          IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication();
          myStore.CreateDirectory("Data");
          XmlSerializer serializer = new XmlSerializer(typeof(List<string>));
          StreamWriter sw = null;
          sw = new StreamWriter(new IsolatedStorageFileStream("Data\\historial.xml", FileMode.OpenOrCreate, myStore));
          serializer.Serialize(sw, historial);
          sw.Close();
        }
    
        public object deserializar()
        {
          IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication();
          myStore.CreateDirectory("Data");
          XmlSerializer serializer = new XmlSerializer(typeof(List<string>));
          StreamReader sr = null;
          sr = new StreamReader(new IsolatedStorageFileStream("Data\\historial.xml", FileMode.OpenOrCreate, myStore));
          List<string> h = new List<string>();
          h = (List<string>)serializer.Deserialize(sr); // AQUÍ ESTÁ EL PROBLEMA     
          sr.Close();
          return h;
        }
    

    Miguel Ángel Cantero http://blog.miguelangelcv.es
    martes, 26 de julio de 2011 9:56

Respuestas

  • Hola Miguel:

     

    Si lo que quieres serializar es por el ejemplo un list<string>. Lo más sencillo seriá que lo guardases en un archivo de texto. tal y como te indico:

     

    Guardar:

    List<string> Lista = new List<string>();
    
            IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();
    
            StringBuilder sb = new StringBuilder();
          
            
            foreach (var a in Lista)
            {
              sb.AppendLine(a);
            }
    
            byte[] data = Encoding.UTF8.GetBytes(sb.ToString());
    
            using (IsolatedStorageFileStream stream = file.CreateFile("file.txt"))
            {
              stream.Write(data, 0, data.Length);
            }
    


    Para Deserializar tienes que utilizar StringReader y cada linea la lees con ReadLine() y la introduces en un List<string>. 

     

    Saludos,


    phurtado
    • Marcado como respuesta miguelangelcv miércoles, 27 de julio de 2011 6:56
    martes, 26 de julio de 2011 12:12

Todas las respuestas

  • Hola Miguel Angel:

     

    Fijate en esta linea There is an error in XML document (4,17).

     

    Te indica que en la fila 4 y en la columna 17 del archivo que lees algo esta mal. ¿Podria ser algún caracter como la ñ,acentos etc. Creo que el metodo Serialize graba en utf-8.

     

    El problema es que en la función Serializar, cuando se guadan los datos algo esta mal y por eso al Deserializar te da el error. 

     

    De todas formas veo cosas raras en la función deserializar()

     

     

     myStore.CreateDirectory("Data") ' No deberías de escribir esta linea esto crea un directorio y se supone que ya exise.


    Deberías preguntar solamente si existe el archivo Data\\historia.xml

    tal y como te indico if (myStore.FileExists(FILE)). realiza el resto

    Saludos,


     


    phurtado
    martes, 26 de julio de 2011 11:06
  • Gracias por la respuesta Pedro.

    Sí, en ocasiones guarda acentos y carácteres especiales. ¿Existe algúna otra alternativa que me permita guardar palabras con dichos caracteres?


    Miguel Ángel Cantero http://blog.miguelangelcv.es
    martes, 26 de julio de 2011 11:29
  • Hola Miguel:

     

    Si lo que quieres serializar es por el ejemplo un list<string>. Lo más sencillo seriá que lo guardases en un archivo de texto. tal y como te indico:

     

    Guardar:

    List<string> Lista = new List<string>();
    
            IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();
    
            StringBuilder sb = new StringBuilder();
          
            
            foreach (var a in Lista)
            {
              sb.AppendLine(a);
            }
    
            byte[] data = Encoding.UTF8.GetBytes(sb.ToString());
    
            using (IsolatedStorageFileStream stream = file.CreateFile("file.txt"))
            {
              stream.Write(data, 0, data.Length);
            }
    


    Para Deserializar tienes que utilizar StringReader y cada linea la lees con ReadLine() y la introduces en un List<string>. 

     

    Saludos,


    phurtado
    • Marcado como respuesta miguelangelcv miércoles, 27 de julio de 2011 6:56
    martes, 26 de julio de 2011 12:12
  • Hola Miguel:

     

    Pense en una que te puede ayudar a Serializar cualquier tipo de objeto y aplicando la técnica que tu propusiste.

     

    List<string> Lista = new List<string>()
            {
              "á",
              "ñ",
              "b"
            };
    
            IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();
    
            
            //Serializar
            using (IsolatedStorageFileStream stream = file.CreateFile("file.txt"))
            {
              using (StreamWriter sw =new StreamWriter(stream,Encoding.GetEncoding("iso-8859-1")))
              {
    
                XmlSerializer ser = new XmlSerializer(typeof(List<string>));
                ser.Serialize(sw, Lista);
              }
            }
            //Deserializar
            if (file.FileExists("file.txt"))
            {
              using (IsolatedStorageFileStream stream = file.OpenFile("file.txt",FileMode.Open))
              {
                using (StreamReader sr = new StreamReader(stream, Encoding.GetEncoding("iso-8859-1")))
                {
    
                  XmlSerializer ser = new XmlSerializer(typeof(List<string>));
                  object o = ser.Deserialize(sr);
                }
              }
            }
    

    Saludos,


    phurtado
    martes, 26 de julio de 2011 12:33
  • Gracias Pedro, ya funciona correctamente :)
    Miguel Ángel Cantero http://blog.miguelangelcv.es
    martes, 26 de julio de 2011 18:37
  • Hola Miguel

    Por favor, cuando alguien te de una respuesta correcta y que te ayude, usa el botón "Marcar como respuesta" para indicar que es una respuesta correcta, son las normas del foro.

    Un saludo


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    miércoles, 27 de julio de 2011 6:28
    Moderador