C/Visual C - persistencia...COMO?

 
Vista:

persistencia...COMO?

Publicado por manuel (14 intervenciones) el 16/07/2006 14:25:14
hola.

alguna idea o algun link sobre almacenamiento de instancias de una clase(persistencia de objetos) en c++, plano? no corba ni nada por el estilo.

mi inquietud es que los objetos siendo de la misma clase <<no necesariamente pueden o deben ser del mismo tamanio>>.

gracias por adelantado

saludos cordiales.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:persistencia...COMO?

Publicado por x (63 intervenciones) el 17/07/2006 15:05:15
no recuerdo exactamente como (lo tengo en un programa mio y solo lo he hecho en una ocasion) pero creo k era abrir en binario y guardar la 'variable'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:persistencia...COMO?

Publicado por fernando.gomez (1603 intervenciones) el 17/07/2006 17:49:30
Pues más bien tendrías que diseñar tú tu propio algoritmo. Por ejemplo, supongamos que quiero serializar:

struct Letras {
char* a;
char *b;
char *c;
char* d;
};

Evidentemente, no se puede hacer simplemente escribiendo una instancia de struct Letras porque los miembros son punteros a caracter, y entonces al serializar, se guardaría la dirección en memoria, en lugar de la cadena de texto. En estos casos, repito, tienes que diseñar tu propio algoritmo. El que yo usualmente empleo es reservar 2 bytes (sizeof(int)) en el archivo binario ANTES de la cadena de texto. Estos dos bytes me indican la longitud de la cadena, de tal suerte que en ese caso leo los siguientes n bytes. Esta forma me funciona bien, aunque evidentemente tienes que codificarlo a mano.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:persistencia...COMO?

Publicado por manuel (14 intervenciones) el 18/07/2006 19:49:50
hola.

gracias por contestar.

guardar lo atributos uno por uno me funciona ok. O sea, guardar el objeto.

mi pregunta iba a: "como tratar en caso de tener objetos de tamanios diferentes, dentro del mismo-archivo, porque a pesar de ser de la misma-clase, pueden ser de tamanios distintos".

gracias de antemano

saludos cordiales
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:persistencia...COMO?

Publicado por fernando.gomez (1603 intervenciones) el 18/07/2006 23:24:46
Ok, toma mi respuesta anterior y reenfócala. Los primeros dos bytes, guarda el tamaño del objeto, y después serializa el objeto mismo. Luego, guardas otros dos bytes con el tamaño del siguiente objeto y después serializas el segundo objeto. Y así te sigues... Para la deserialización, sería un paso similar... lees dos bytes y en base a este valor, lees los siguientes n bytes... etcétera.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:persistencia...COMO?

Publicado por manuel (14 intervenciones) el 19/07/2006 00:25:44
Hola.

gracias por la atencion.

El metodo que me mencionas, tambien lo utilizo, pero el asunto es otro.

Mejor con un ejemplito. Tengo una clase:

class person
{
public:
// voy a omitir cons, dest y metodos

private:
vector<string> telefonos;
};

Digamos que solo sea eso: un vector de string, para telefonos, donde una persona puede tener mas telefonos que otra.
Por cada string(telefono) en el vector, grabo su size y el contenido de la string. Hasta aqui ok.

El asunto se presenta cuando tenga objetos tipo 'person' que contienen diferentes cantidades de telefonos, digamos un objeto 'person' puede tener mas telefonos que otro y la longitud de la numeracion no necesariamente tiene que ser uniforme, ya que pueden ser telefonos moviles o no.

Figurativamente algo asi:
(estoy omitiendo 'size' de cada string)

p1 21202 29810 76623 77629
p2 725300 229826 112092

Y en alguna oportunidad surge la necesidad de adicionar un tel mas a 'p1', pero como 'p2' es la continuacion, se va a generar una "colision".

alguna idea?
gracias de antemano
saludos cordiales
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:persistencia...COMO?

Publicado por fernando.gomez (1603 intervenciones) el 19/07/2006 01:10:09
Pues tendrías que reescribir el archivo, me imagino.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:persistencia...COMO?

Publicado por manuel (14 intervenciones) el 19/07/2006 02:37:50
hola.

Eso hago, pero suponiendo que el tamano de los objetos fuera mayor y la cantidad de objetos tambien, podria tomar un buen tiempo reescribir todo el archivo para hacer una modificacion en un solo objeto.

sabes si hay alguna otra forma? O mejor aun, algunos links donde haya informacion al respecto?

saludos
gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:persistencia...COMO?

Publicado por Nelek (816 intervenciones) el 19/07/2006 14:03:29
Mmm, yo no estoy a tanto nivel, pero al leer esto se me ha ocurrido una idea. Quiza te sirva, quiza no... Seguramente no sea lo optimo, pero bueno. La unica putada, que no seria dinamico (dentro de lo que cabe)

Se sabe que tienes un numero variable de elementos dentro del objeto y que tienen un tamaño no fijado como tu dices.

Si a cada objeto le reservas un espacio de X bytes para todos sus elementos, y te ideas una especie de "elemento_final" con alguna secuencia que no se vaya a dar en casos normales (por ej. siguiendo con los telefonos un 000000, o algo asi), podrias guardar los elementos que si que tienes, poner el elemento final, e irte al siguiente objeto dejando el hueco entre medias vacio.

Luego a la hora de añadir o quitar elementos a un objeto, como cadad objeto tiene su tamaño fijado, podrias localizarlo relativamente facil, extraer el elemento, modificarlo como a ti te convenga y volver a guardarlo sobreescribiendo solo ese segmento del fichero en lugar del fichero entero.

Inconvenientes, la primera vez que el fichero se guarde... tardara mucho, muchisimo mas. El tamaño será mucho mayor de lo necesario en primera instancia.
Pero en contrapartida, a la hora de editar (que creo que para ti es mas importante) lo tendrias todo mas disponible y no tendrias que sobreescribir el fichero entero cada vez que modifiques uno de tus elementos, solamente la parte que a ti te interese.

El como hacerlo... ni idea, pero al menos tienes otra alternativa, ahora depende de ti el sopesarla y ver si te saldria rentable para tu aplicacion o no.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:persistencia...COMO?

Publicado por manuel (14 intervenciones) el 19/07/2006 17:27:39
hola.

gracias por la atencion.

ya habia considerado esa idea.
ni modo. parece que no hay otra alternativa.

de todas formas gracias.

saludos cordiales
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar