none
Problema al serializar/deserializar objeto C# RRS feed

  • Pregunta

  • Cuando quiero deserializar me sale un la excepcion "Se llegó al final de la secuencia antes de terminar el análisis"

    no se donde puede estar el problema.

    De esta forma guardo los objetos en el fichero txt (adjunto parte del código)

    BinaryFormatter bf = new BinaryFormatter();
    FileStream Archivo = File.OpenWrite(urlDatos + nombreArchivo);
    bf.Serialize(Archivo, user); //user es instancia de Usuario, este objeto lo recibo por parametro
    Archivo.Close();
    Luego para deserializar, por lo que pude ver en el último ciclo del while streamIn.Length vale 426 y streamIn.Positiion=421 
                using (FileStream streamIn = File.OpenRead(urlDatos+nombreArchivo))
                {
                    usuarios = new List<Usuario>();
                    BinaryFormatter formatter = new BinaryFormatter();
                    streamIn.Position = 0;
                    while (streamIn.Position != streamIn.Length)
                    {
                        usuarios.Add((Usuario)formatter.Deserialize(streamIn));
                    }
                    return usuarios;
                }



    sábado, 1 de junio de 2019 16:57

Respuestas

  • Hola, como te dije en otra pregunta, el problema inicial lo tienes porque serializas a archivo una única instancia de usuario por lo que haciendo

    var usuario = (Usuario)bf.Deserialize(Archivo) ;

    Te valdría 

    Si quieres guardar listas haría los siguiente

    BinaryFormatter bf = new BinaryFormatter();
    FileStream Archivo = File.OpenWrite(urlDatos + nombreArchivo);
    bf.Serialize(Archivo, new List<Usuario>() { user} ); //user es instancia de Usuario, este objeto lo recibo por parametro
    Archivo.Close();


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    domingo, 2 de junio de 2019 7:53
    Moderador

Todas las respuestas

  • hola estoy teniendo este error y no se como solucionarlo , a que se debe ??

    sábado, 1 de junio de 2019 5:45
  • Hola, puedes mostrar el código en el cual serializas a tu archivo y luego el código de la deserializacion? Puede que únicamente estés guardando un elemento en el archivo y no una lista con un elemento. De todas formas puedes también intentar leer un registro deserializarlo, agregarlo a una lista y seguir leyendo el siguiente registro

    public static List<Usuario> DeserializeListUsuario(string filename)
    {
        using (FileStream streamIn = File.OpenRead(filename))
        {
            List<Usuario> list = new List<Usuario>();
            BinaryFormatter formatter = new BinaryFormatter();
            while(streamIn.Position != streamIn.Length)
            {
                list.Add((Usuario) formatter.Deserialize(streamIn));
            }
            return list;
        }
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    sábado, 1 de junio de 2019 8:22
    Moderador
  • Hola, puedes mostrar el código en el cual serializas a tu archivo y luego el código de la deserializacion? Puede que únicamente estés guardando un elemento en el archivo y no una lista con un elemento. De todas formas puedes también intentar leer un registro deserializarlo, agregarlo a una lista y seguir leyendo el siguiente registro

    public static List<Usuario> DeserializeListUsuario(string filename)
    {
        using (FileStream streamIn = File.OpenRead(filename))
        {
            List<Usuario> list = new List<Usuario>();
            BinaryFormatter formatter = new BinaryFormatter();
            while(streamIn.Position != streamIn.Length)
            {
                list.Add((Usuario) formatter.Deserialize(streamIn));
            }
            return list;
        }
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    Cuando leo el archivo con el while, me dice "se llegó al final de la secuencia antes de terminar el analisis
    sábado, 1 de junio de 2019 15:38
  • hola

    no entiendo, que contiene urlDatos ?

    porque para deserializar tienes que usar un while ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 3 de junio de 2019 14:07
    sábado, 1 de junio de 2019 18:03
  • hola

    no entiendo, que contiene urlDatos ?

    porque para deserializar tienes que usar un while ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    urlDatos simplemente es la raiz donde se guardan todos los archivos.txt,

    respecto al while: como en ese fichero guardo varios objetos Usuario entonces tenia que sacarlos con un ciclo (asi ví en algunos ejemplos de internet)

    sábado, 1 de junio de 2019 18:09
  • hola

    Pero la variable dice url a que raiz de directorio haces referencia? no le pongas a una variable url si vas a contener un path fisico a una carpeta de la pc local.

    Estas serializando a binario no puede cortar por objeto, serializas todos juntos y obtienes todos en una sola operacion, eso del while es incorrecto

    Si serialializaste una List<usuario> esto es un bloque, tiene que deserializar esa misma lista leyendo todo el contenido del archivo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 3 de junio de 2019 14:07
    domingo, 2 de junio de 2019 0:37
  • Hola. Cuando guardas en archivo solo guardas una entidad? Entonces con deserializarlo a esa entidad te valdría.


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    domingo, 2 de junio de 2019 7:36
    Moderador
  • Hola, como te dije en otra pregunta, el problema inicial lo tienes porque serializas a archivo una única instancia de usuario por lo que haciendo

    var usuario = (Usuario)bf.Deserialize(Archivo) ;

    Te valdría 

    Si quieres guardar listas haría los siguiente

    BinaryFormatter bf = new BinaryFormatter();
    FileStream Archivo = File.OpenWrite(urlDatos + nombreArchivo);
    bf.Serialize(Archivo, new List<Usuario>() { user} ); //user es instancia de Usuario, este objeto lo recibo por parametro
    Archivo.Close();


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    domingo, 2 de junio de 2019 7:53
    Moderador
  • Deleted
    • Propuesto como respuesta Carlos_Ruiz_M lunes, 3 de junio de 2019 14:07
    domingo, 2 de junio de 2019 16:47