none
Serializar varias clases en un solo archivo RRS feed

  • Pregunta

  • Hola muy buenos noches desde Colombia;

    En esta oportunidad quisiera saber si es posible serializar varias clases en un solo archivo?. De no ser así ¿ còmo puedo yo crear un archivo donde pueda guardar todos los datos de mi aplicación(varios formularios, un formulario para cada clase), yy luego este se pueda leer?. ¿Acaso se puede hacer con una BD y camuflar el archivo con una extensiòn que yo defino, y luego poder abrir y leer dichos valores guardadso en dicho archivo?

    Gracias, y espero me uedan asesorar en esto. He investigad, y por todas partes hablan de serializar una clase.


    Harold Alonso Quintero Pineda Ingeniero Civil Universidad Francisco de Paula Santander Ocaña Correo: haroldpineda1401@outlook.com Cel: 3158700970

    sábado, 24 de octubre de 2015 1:44

Respuestas

  • Por ejemplo, si hay que guardar tres clases llamadas Clase1, Clase2 y Clase3, la clase contenedora sería algo tan simple como esto:

    public class Contenedor
    {
        public Clase1 Valor1 { get; set; }
        public Clase2 Valor2 { get; set; }
        public Clase1 Valor3 { get; set; }
    }
    
    //...
    
    Contenedor c = new Contenedor();
    c.Valor1 = laInstanciaDeClase1AGuardar;
    c.Valor2 = laInstanciaDeClase2AGuardar;
    c.Valor3 = laInstanciaDeClase3AGuardar;
    //Aquí serializaremos c.

    Y en cuanto a la otra parte, efectivamente si hay 15 clases es necesario introducir las 15 instrucciones para serializarlas. Por supuesto, nada impide usar para ello un bucle, en el caso de que las 15 las tengas ya almacenadas en algún sitio (tal como un array de forms) en el que hayas previsto guardar todos los formularios. Nota: esto es solo si ya lo tienes hecho, no merece la pena que lo hagas solo para ahorrarte unas pocas líneas en el proceso de serialización.
    domingo, 25 de octubre de 2015 16:11
  • Señor Alberto muy buenos dìas;

    Agradezco por responderme, en el caso de que haga la primera opciòn que me ha dicho de construir una nuieva clase donde contenga todas las que quiero serializar ¿cómo podrìa haerlo?¿podrìa suministrarme un ejemplo?. Si lo pregunto, es porque tengo mi cierta duda, pues nunca he hecho algo como lo que me dice de incluir en una nueva clase todas las demas(clases que debidamente estan separadas para construir cada formulario de mi aplicaciòn).

    Respecto a la segunda opción:

    FileStream stream = new FileStream(....);
    IFormatter formatteador = new BinaryFormatter(); //u otro formateador
    formatteador.Serialize(stream, miObjetoClase1);
    formatteador.Serialize(stream, miObjetoClase2);
    formatteador.Serialize(stream, miObjetoClase3);
    stream.Close();

    Si tengpo por ejemplo 15 clases(15 formularios, pues como le dije construyo una clase para cada formulario), tendrìa que llamar 15 veces el còdigo :

    formatteador.Serialize(stream, miObjetoClase1);
    formatteador.Serialize(stream, miObjetoClase2);
    formatteador.Serialize(stream, miObjetoClase3);

    Espero pueda ayudarme con estas dudas, principalmente la de la priera forma.

    DIOS LO BENDIGA.


    Harold Alonso Quintero Pineda Ingeniero Civil Universidad Francisco de Paula Santander Ocaña Correo: haroldpineda1401@outlook.com Cel: 3158700970

    domingo, 25 de octubre de 2015 15:03

Todas las respuestas

  • Una forma muy sencilla de serializar varias clases en un solo archivo consiste en construir una nueva clase que dentro contenga todas las demás, y serializar esta nueva clase.

    Otra opción es dejar abierto el Stream, y seguir llamando a Serialize sobre el mismo Stream para añadir nuevos objetos al fichero:

    FileStream stream = new FileStream(....);
    IFormatter formatteador = new BinaryFormatter(); //u otro formateador
    formatteador.Serialize(stream, miObjetoClase1);
    formatteador.Serialize(stream, miObjetoClase2);
    formatteador.Serialize(stream, miObjetoClase3);
    stream.Close();

    sábado, 24 de octubre de 2015 17:06
  • Señor Alberto muy buenos dìas;

    Agradezco por responderme, en el caso de que haga la primera opciòn que me ha dicho de construir una nuieva clase donde contenga todas las que quiero serializar ¿cómo podrìa haerlo?¿podrìa suministrarme un ejemplo?. Si lo pregunto, es porque tengo mi cierta duda, pues nunca he hecho algo como lo que me dice de incluir en una nueva clase todas las demas(clases que debidamente estan separadas para construir cada formulario de mi aplicaciòn).

    Respecto a la segunda opción:

    FileStream stream = new FileStream(....);
    IFormatter formatteador = new BinaryFormatter(); //u otro formateador
    formatteador.Serialize(stream, miObjetoClase1);
    formatteador.Serialize(stream, miObjetoClase2);
    formatteador.Serialize(stream, miObjetoClase3);
    stream.Close();

    Si tengpo por ejemplo 15 clases(15 formularios, pues como le dije construyo una clase para cada formulario), tendrìa que llamar 15 veces el còdigo :

    formatteador.Serialize(stream, miObjetoClase1);
    formatteador.Serialize(stream, miObjetoClase2);
    formatteador.Serialize(stream, miObjetoClase3);

    Espero pueda ayudarme con estas dudas, principalmente la de la priera forma.

    DIOS LO BENDIGA.


    Harold Alonso Quintero Pineda Ingeniero Civil Universidad Francisco de Paula Santander Ocaña Correo: haroldpineda1401@outlook.com Cel: 3158700970

    domingo, 25 de octubre de 2015 15:03
  • Por ejemplo, si hay que guardar tres clases llamadas Clase1, Clase2 y Clase3, la clase contenedora sería algo tan simple como esto:

    public class Contenedor
    {
        public Clase1 Valor1 { get; set; }
        public Clase2 Valor2 { get; set; }
        public Clase1 Valor3 { get; set; }
    }
    
    //...
    
    Contenedor c = new Contenedor();
    c.Valor1 = laInstanciaDeClase1AGuardar;
    c.Valor2 = laInstanciaDeClase2AGuardar;
    c.Valor3 = laInstanciaDeClase3AGuardar;
    //Aquí serializaremos c.

    Y en cuanto a la otra parte, efectivamente si hay 15 clases es necesario introducir las 15 instrucciones para serializarlas. Por supuesto, nada impide usar para ello un bucle, en el caso de que las 15 las tengas ya almacenadas en algún sitio (tal como un array de forms) en el que hayas previsto guardar todos los formularios. Nota: esto es solo si ya lo tienes hecho, no merece la pena que lo hagas solo para ahorrarte unas pocas líneas en el proceso de serialización.
    domingo, 25 de octubre de 2015 16:11
  • Le agradezco enormemente por tomarse el tiempo de responderme señor Alberto, realmente agradecido por su aporte, la verdad muy bien explicado. Ahora, segùn su experiencia ¿cual me recomienda màs? y ¿porque debo escoger la que usted me sugiere?.

    Muchas gracias de nuevo por todo.


    Harold Alonso Quintero Pineda Ingeniero Civil Universidad Francisco de Paula Santander Ocaña Correo: haroldpineda1401@outlook.com Cel: 3158700970

    domingo, 25 de octubre de 2015 16:37
  • Entre usar una clase o serializar todas una detrás de otra, la diferencia será insignificante. La clase única añadirá unos bytes más al archivo, pero la diferencia es tan pequeña que no merece la pena tenerla en cuenta. Aquí el factor de decisión más importante será la elegancia y mantenibilidad del código. Si el programa está estructurado de forma que centralice en un único sitio todos los ajustes que deben salvarse, ese sitio sería la clase única de la que hemos venido hablando.
    lunes, 26 de octubre de 2015 6:35
  • BinaryFormatter formatter = new BinaryFormatter();           
    FileStream stream = new FileStream(path, FileMode.Append, FileAccess.Write);
    formatter.Serialize(stream, Object);
    


    • Editado legolas2024 lunes, 26 de octubre de 2015 16:31
    lunes, 26 de octubre de 2015 16:31
  • Señor Alberto, la idea mía es tambien además de guardar los datos que ingresa, es las configuraciones que él realicé al mismo(no se si a través del My.Settings sea la opción, o mejor crear uan clase específicamente para guardar la configuración del usuario). Pero según lo que usted me dice, y viendo lo que quiero lograr con mi aplicación, creo que es mejor hacerlo todo en una clase contenedora.

    Muchas gracias por todo su apoyo.


    Harold Alonso Quintero Pineda Ingeniero Civil Universidad Francisco de Paula Santander Ocaña Correo: haroldpineda1401@outlook.com Cel: 3158700970

    lunes, 26 de octubre de 2015 21:12
  • Muchas gracias legolas2024, al igual que el señor Alberto, por tomarse el tiempo de poder ayudarme. Espero más adelante me puedan seguir ayudando, para cuando se me presenten dudas y problemas que no pueda solucionar.

    Dios los bendiga.


    Harold Alonso Quintero Pineda Ingeniero Civil Universidad Francisco de Paula Santander Ocaña Correo: haroldpineda1401@outlook.com Cel: 3158700970

    lunes, 26 de octubre de 2015 21:13