none
Pasar lista de objetos como parametro? RRS feed

  • Pregunta

  • Hola chicos.

    tengo una aplicación en la cual utilizo muchos métodos de serializar y deserializar a disco.

    por ejemplo 

    tengo una lista de objetos (cliente) llamada Listaclientes

    el objeto cliente esta formador por

    cliente.id, cliente.nombre, cliente.tel, etc. etc. etc.

       

    private void SerializarClientes();

        {

                XmlSerializer serializador = new XmlSerializer(typeof(List<cliente>));
                TextWriter escritor = new StreamWriter("NombreArchivo.xml");
                serializador.Serialize(escritor, ListaClientes);
                escritor.Close();
            }

    private void deserializarClientes()
            {

                XmlSerializer serializador = new XmlSerializer(typeof(List<Cliente>));

                    FileStream lector = File.OpenRead(NombreArchivo);
                    ListaClientes = (List<Cliente>)serializador.Deserialize(lector);
                    lector.Close();

               }

    esto funciona bien.

    mi duda es:

    yo quiero poner estos 2 métodos en una clase por ej. "Serializaciones"

    y crear un método genérico que yo pueda usarlo con otros tipo de lista;

    algo así:

    creo los objetos

    artículos, clientes, proveedores

    y luego las listas

    List<Articulo> ListadeArticulos new List<articulo>();

    List<clientes> Listadeclientes new List<clientes>();

    List<proveedores> Listadeproveedores new List<proveedores>();

    ListaArticulos=deserializar("articulos.xml",articulo)

    ListaClientes=deserializar("clientes.xml",clientes)

    ListaProveedoress=deserializar("provee.xml",provedores)

    para no crear un metodo para cada lista me gustaria crear un metodo reutilizable.

    pienso que el metodo deberia ser algo asi:

    private list<> deserializar(string NombreArchivo, object elemento)

            {

                XmlSerializer serializador = new XmlSerializer(typeof(List<elemento>));

                   FileStream lector = File.OpenRead(NombreArchivo);

                   lector.Close();

                   return (List<elemento>)serializador.Deserialize(lector);

               }

    pero no me doy cuenta como hacerlo. no me funciona pasar el objeto elemento

    espero que alguien entienda lo que quiero hacer.

    muchísimas gracias por tu tiempo.

    viernes, 8 de septiembre de 2017 18:45

Respuestas

  • Hola. Conoces el concepto de genéricos en C#? Para esto te vendrá bien.

    private List<T> deserializar(string NombreArchivo)
            {
    
                XmlSerializer serializador = new XmlSerializer(typeof(List<T>));
    
                   FileStream lector = File.OpenRead(NombreArchivo);
    
                   lector.Close();
    
                   return (List<T>)serializador.Deserialize(lector);
    
               }

    Para usarlo harías

    var lista = deserializar<Clientes>(archivo);

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

    • Propuesto como respuesta Willams Morales viernes, 8 de septiembre de 2017 19:03
    • Marcado como respuesta Luxanty sábado, 9 de septiembre de 2017 0:22
    viernes, 8 de septiembre de 2017 18:59
    Moderador
  • Puedes usar un genérico <T>:

    private List<T> deserializar<T>(string NombreArchivo)
    {
        XmlSerializer serializador = new XmlSerializer(typeof(List<T>));
        FileStream lector = File.OpenRead(NombreArchivo);
        List<T> resultado = (List<T>)serializador.Deserialize(lector);
        lector.Close();
        return resultado;
    }
    
    Llamálo como List<cliente> lista = deserializar<cliente>(fichero);

    • Propuesto como respuesta Willams Morales viernes, 8 de septiembre de 2017 19:03
    • Marcado como respuesta Luxanty sábado, 9 de septiembre de 2017 0:22
    viernes, 8 de septiembre de 2017 19:01
    Moderador
  • La T la defines al hacer la llamada. Por ejemplo, cuando la función la llamas así:

    lista = deserializar<cliente>(fichero);

    le estás diciendo que la T es cliente.

    • Marcado como respuesta Luxanty sábado, 9 de septiembre de 2017 0:22
    viernes, 8 de septiembre de 2017 19:38
    Moderador

Todas las respuestas

  • Hola. Conoces el concepto de genéricos en C#? Para esto te vendrá bien.

    private List<T> deserializar(string NombreArchivo)
            {
    
                XmlSerializer serializador = new XmlSerializer(typeof(List<T>));
    
                   FileStream lector = File.OpenRead(NombreArchivo);
    
                   lector.Close();
    
                   return (List<T>)serializador.Deserialize(lector);
    
               }

    Para usarlo harías

    var lista = deserializar<Clientes>(archivo);

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

    • Propuesto como respuesta Willams Morales viernes, 8 de septiembre de 2017 19:03
    • Marcado como respuesta Luxanty sábado, 9 de septiembre de 2017 0:22
    viernes, 8 de septiembre de 2017 18:59
    Moderador
  • Puedes usar un genérico <T>:

    private List<T> deserializar<T>(string NombreArchivo)
    {
        XmlSerializer serializador = new XmlSerializer(typeof(List<T>));
        FileStream lector = File.OpenRead(NombreArchivo);
        List<T> resultado = (List<T>)serializador.Deserialize(lector);
        lector.Close();
        return resultado;
    }
    
    Llamálo como List<cliente> lista = deserializar<cliente>(fichero);

    • Propuesto como respuesta Willams Morales viernes, 8 de septiembre de 2017 19:03
    • Marcado como respuesta Luxanty sábado, 9 de septiembre de 2017 0:22
    viernes, 8 de septiembre de 2017 19:01
    Moderador
  • gracias por responder, la verdad no estoy familiarizado con el concepto genericos en c#,

    ingrese tu codigo, pero no entiendo lo de <T> debo definir T antes?

    viernes, 8 de septiembre de 2017 19:35
  • La T la defines al hacer la llamada. Por ejemplo, cuando la función la llamas así:

    lista = deserializar<cliente>(fichero);

    le estás diciendo que la T es cliente.

    • Marcado como respuesta Luxanty sábado, 9 de septiembre de 2017 0:22
    viernes, 8 de septiembre de 2017 19:38
    Moderador
  • ya entendi... una ultima cosita.

    suponte que creo esos metodos en una clase Seriales

    deberia llamarlos asi?

    var lista = Seriales.deserializar<clientes>(fichero)

    te pregunto x q deserializar no me aparece

    y esta como public la clase y el metodo.

    l

    viernes, 8 de septiembre de 2017 19:47
  • var lista = Seriales.deserializar<clientes>(fichero)

    Esto solo funciona si el método deserializar está marcado como static. Si no lo quieres hacer static, entonces primero hay que instanciar la clase y luego llamarlo a través de la instancia:

    var instancia = new Seriales();

    var lista = instancia.deserializar<clientes>(fichero);

    Nótese que esto no tiene nada que ver con el hecho de que el método sea Genérico. Te pasaría exactamente lo mismo con cualquier otro método de cualquier otro tipo.

    sábado, 9 de septiembre de 2017 8:22
    Moderador