Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-03-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
[RESUELTO] Guardar estructura de memoria (clases) a disco

Buenas a todos.
No se si el título explica claramente lo que necesito hacer, así que intentaré explicarme un poco mejor.

Se trata de que tengo en memoria una serie de datos almacenados en clases y listas de elementos que debo exportar a disco. Es una estructura compleja, por ejemplo una clase A, que posee propiedades (algunas enteros y otras cadenas) y una lista de elementos de la clase B. A su vez la clase B posee algún ENTERO, algún STRING y una lista de elementos de la Clase C. La clase C a su vez son una lista de PUNTOS y alguna propiedad más.

La estructura no es exactamente así, pero es bastante aproximada para que os hagáis una idea. La representaríamos como se ve a continuación.

Código Delphi [-]

Clase A
==============
prop1: integer
prop2: integer
prop3:string
prop4: List of ClaseB
...

Clase B
=============
prop1: boolean
prop2: string
prop3: integer
prop4: List of claseC
...

Clase C
==============
prop1: List of Tpoint
prop2:Tcolor
...

Ya tengo una o dos ideas para almacenarlo en disco (BACKUP) y después poder recuperarlo (RESTORE), pero la verdad es que ninguna de ellas me resulta sencilla.
Ya sea guardar en un formato tipo XML/JSON/... o incluso guardarlos en ficheros planos y empaquetarlo todo en un ZIP.

El caso es que estaba dándole vueltas a si habría alguna manera más fácil de hacerlo que no signifique recorrer todos los elementos de todas las clases. Algo así como el WriteComponent de la clase TStream. Algo que me permita "volcar" toda la clase y recuperarla de una sóla vez.
A lo mejor estoy "desvariando"... Si es así no me hagáis caso...

Se aceptan ideas, sugerencias, críticas,...

P.D: No necesito código sólo una idea/orientación.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 06-03-2013 a las 20:04:08.
Responder Con Cita
  #2  
Antiguo 06-03-2013
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Quizá si derivas de TComponent/TCollectionItem y usas TCollection para las listas puedas usar WriteComponent y ReadComponent.

// Saludos
Responder Con Cita
  #3  
Antiguo 06-03-2013
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

O lo ya apuntado o usar RTTI de forma más o menos similar a la explicada en este artículo. Reconozco que ahora mismo no se me ocurre otra forma. Quizá que tratando de hacerlo con "WriteComponent" y "ReadComponent" el asunto pueda resultar algo más rápido de implementar (digo yo...) y también más rápido a la hora de realizar la tarea en cuestión.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 06-03-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por dec Ver Mensaje
O lo ya apuntado o usar RTTI de forma más o menos similar a la explicada en este artículo.
Hola David, gracias por el link.
Lo he ojeado por encima y tiene buena pinta aunque no se si cubre lo que necesito. ¿Qué pasaría con las clases anidadas?
No veo claro que con eso se puedan añadir al mismo fichero; Y me queda también la duda de las listas.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 06-03-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por roman Ver Mensaje
Quizá si derivas de TComponent/TCollectionItem y usas TCollection para las listas puedas usar WriteComponent y ReadComponent.
Después de escribir lo del WriteComponent lo he pensado, pero hay también algún record.
De todas formas si fuera por eso estos records se podrían convertir a otra cosa.

Le doy una vuelta Román.
Gracias.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 06-03-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Germán.

Cita:
Empezado por roman Ver Mensaje
Quizá si derivas de TComponent/TCollectionItem y usas TCollection para las listas puedas usar WriteComponent y ReadComponent.
Este que comenta Román sería el camino más directo, pero supongo que por una buena razón esas clases no derivan de TComponent. Relacionado con esto, ya has de saber que la clase padre de TComponent, TPersistent, es la primera en introducir mecanismos de streaming:
Cita:
Use TPersistent as a base class when declaring objects that are not components, but that need to be saved to a stream or have their properties assigned to other objects.
Por otro lado, sea cual sea el mecanismo que uses, es menester que la información de las propiedades esté disponible mediante reflexión (RTTI), lo cual hace que tengas que declarar dichas propiedades con visibilidad publicada (published).

Eso último se flexibiliza a partir de Delphi 2010, y el artículo que refiere dec va muy bien con el tema.

Ya nos dirás más, saludos.
Responder Con Cita
  #7  
Antiguo 06-03-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Le voy a dar otra vuelta al artículo, porque me parece que la primera vez lo he mirado "demasiado por encima"...

En cuanto a porqué las clases no derivaban de TComponent, es simplemente porque no son componentes.
En este caso no habría ningún problema en derivarlas de TPersistent si eso me aporta beneficios y tampoco lo hay en cuanto a la visibilidad de las propiedades, pues ahora son públicas y no hay problema en convertirlas a published para añadir datos de RTTI.

A ver si mañana puedo hacer alguna prueba para evaluar ambas soluciones y os comento...

Gracias.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 06-03-2013
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Al González Ver Mensaje
Relacionado con esto, ya has de saber que la clase padre de TComponent, TPersistent, es la primera en introducir mecanismos de streaming:
Sí lo sabía pero oprimí Enviar muy rápido De hecho, TCollectionItem y TCollection derivan directamente de TPersistent.

// Saludos
Responder Con Cita
  #9  
Antiguo 06-03-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Sobre los objetos anidados, no hay más camino que recorrer todos los elementos, entrando a cada propiedad objeto o lista de objetos. Eso ya lo hace WriteComponent. Pero si quieres implementar un mecanismo propio que evite la derivación de TComponent, entonces puedes echar una mirada a los métodos WriteProperties y WriteProperty de la clase nativa TWriter. Aunque en lo personal y teniendo Delphi 2010 o superior, buscaría en él algo de la RTTI extendida que facilite las cosas.

Lo de la "buena razón", ni qué decir...gajes del oficio de abreviar.
Responder Con Cita
  #10  
Antiguo 06-03-2013
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Al, por lo poco que sé, me parece que, a partir de Delphi 2010, no es necesario para trabajar con RTTI declarar propiedades "published", puesto que antes de Delphi 2010 sí que era como dices. Germán, me extraña que no tengas tú sobrada experiencia recorriendo objetos y posibles propiedades luego de tu proyecto GLibWMI. Creo recordar que también te toca lidiar con diferentes tipos de propiedades y resultados, etc. Pienso que no es exactamente igual, pero, es parecido. Además, es posible que no tengas que construir todo un "Serializador de objetos", sino algo que te apañe de momento, al menos.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #11  
Antiguo 06-03-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por Al González Ver Mensaje
[...] sea cual sea el mecanismo que uses, es menester que la información de las propiedades esté disponible mediante reflexión (RTTI), lo cual hace que tengas que declarar dichas propiedades con visibilidad publicada (published).

Eso último se flexibiliza a partir de Delphi 2010, y el artículo que refiere dec va muy bien con el tema.
Cita:
Empezado por dec Ver Mensaje
Al, por lo poco que sé, me parece que, a partir de Delphi 2010, no es necesario para trabajar con RTTI declarar propiedades "published", puesto que antes de Delphi 2010 sí que era como dices.
Tienes razón, David. Por eso lo de: «Eso último se flexibiliza a partir de Delphi 2010».
Responder Con Cita
  #12  
Antiguo 07-03-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por dec Ver Mensaje
Germán, me extraña que no tengas tú sobrada experiencia recorriendo objetos y posibles propiedades luego de tu proyecto GLibWMI.
...Además, es posible que no tengas que construir todo un "Serializador de objetos", sino algo que te apañe de momento, al menos.
Si no es por no ir, si hay que ir, se va...
Pero es que me daba mandra y me entró la curiosidad...

Al final estoy viendo que es bastante problabe que tenga que hacer algún recorrido.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
POO - Guardar en disco objetos en tiempo de ejecución hectoralejandro OOP 2 26-01-2012 23:23:16
Guardar un correo electronio en disco con MAPI adebonis API de Windows 7 17-08-2007 23:47:01
saber si una unidad de disco es una memoria flash o memory stick compaqdavid Varios 1 06-12-2006 14:07:10
Guardar estructura en tabla JAV Conexión con bases de datos 7 19-04-2005 04:30:35
Capturar el evento de guardar en disco magm2000 Impresión 1 29-07-2004 16:14:47


La franja horaria es GMT +2. Ahora son las 12:17:32.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi