2008-09-16 22 views
6

Alguien ha tenido problemas para serializar componentes en un archivo y leerlos, específicamente en el área donde el proveedor del componente actualiza los componentes VCL. Por ejemplo, un archivo serializado con DelphiX y luego años más tarde volver a leer con delphiY. ¿Cambian los formatos de serialización? En caso afirmativo, ¿qué se puede hacer para evitar la lectura de errores en los componentes al realizar la actualización?Serialización de componentes Delphi

Respuesta

3

El sistema basado en RTTI para serializar propiedades publicadas es vulnerable a cambios en los componentes. Avanzar es manejable siempre que las propiedades antiguas se mantengan en objetos nuevos. Es decir. dejas la interfaz de la propiedad como está, pero puedes descartar los contenidos si quieres. Retroceder es peor, ya que una versión más reciente de la propiedad guardada no se puede abrir en versiones anteriores, y eso será un problema.

Hay componentes/libs (http://www.torry.net/quicksearchd.php?String=RTTI&Title=Yes) que pueden agregar serialización en formato XML y esto puede ayudar un poco ya que puede elegir omitir el contenido que no conoce.

Aún debe tener en cuenta cómo diseña su contenido publicado y probablemente debería encontrar una forma de "ignorar pero propagar" el contenido que su versión actual no comprende. Esto le permitirá abrir y cambiar un archivo en un formato más nuevo mientras intenta mantener los atributos más nuevos, en lugar de eliminarlos.

+0

Usando VCL-Streaming puede manejar propiedades perdidas (y clases faltantes y otros errores también) cuando usa Classes.TReader directamente y escribe un controlador para el evento OnError. Encontró todo el código necesario en la unidad de Clases. La mayor desventaja es que su clase/clases deben derivarse de TComponent o al menos de TPersistent. –

0

Los formatos cambiarán definitivamente, ya que los proveedores agregarán características a sus componentes. La serialización simplemente enlaza todas las propiedades publicadas y las guarda en una secuencia. Cuando se vuelven a leer, cada una de las propiedades que se leen de la secuencia se volverá a establecer en el componente. Si la propiedad ya no existe, tienes un problema. No creo que puedas hacer nada al respecto además del manejo básico de excepciones.

La mejor manera de garantizar la compatibilidad es hacer su propia serialización.

0

Gracias por la respuesta. Estaba tratando de evitar la serialización personalizada y aprovechar la técnica de serialización de cada componente, pero con la falta de alguna forma de "parchar" una actualización a un nuevo formato de componente, supongo que la serialización personalizada es el único método.

+0

Puede hacer nuevas versiones capaces de leer transmisiones antiguas siempre y cuando todavía tenga soporte de lectura para parámetros viejos y obsoletos. El problema radica en obtener lanzamientos viejos para leer nuevas transmisiones que no se pueden hacer sin una serialización personalizada. –

Cuestiones relacionadas