2010-03-08 9 views
6

Hallo.Delphi: transporte de objetos a computadoras remotas

Estoy escribiendo un software de pedido de nivel 2 para el uso de la red. Entonces tenemos cliente y servidor.

En el cliente creo Objetos de TBest en los que se guarda el ID del producto, la cantidad y el usuario que lo ordena. (Entonces este es un artículo de una orden).

Una orden puede tener varios elementos y esos se guardan en una matriz para luego enviar la orden creada al servidor. La clase que contiene la matriz se llama TBestellung.

así que creé tanto

TBest.toString: string; 

y

TBest.fromString(source: string): TBest; 

Ahora, enviar el resultado toString al servidor vía el zócalo y en el servidor que crear el objeto utilizando fromstring (su análisis de los atributos recibido). Esto funciona según lo previsto.

Pregunta: ¿Hay una manera mejor y más elegante de hacer eso? La serialización es una palabra clave, sí, pero ¿no es horrible/difícil cuando serializa un objeto (TBestellung en este caso) que contiene una matriz de otros objetos (TBest en este caso)?

// Pequeña enmienda: Antes de que se solicite. Sí, debería crear una clase extra (estática) para toString y fromString porque, de lo contrario, el servidor necesita crear un TBest "vacío" para poder usar fromString.

+2

No es toda una respuesta, pero un comentario sobre su "Pequeña enmienda". En lugar de una clase estática, es posible que desee un método estático (o un método de clase como se llaman en Delphi) para su método fromString en la clase TBest, pero el método toString sería una función normal en su clase TBest. –

+0

awrr, error de tipeo. sin embargo, gracias – Acron

Respuesta

6

hay bibliotecas de serialización gratuitas para Delphi (también para Free Pascal):

JSON y XML son multiplataforma/cross-language que podría ser útil para futuras interfaces con otros sistemas, como la tienda web basada en PHP, por ejemplo. También son estándares libres y abiertos (sin bloqueo de proveedor)

Actualización: No utilizaría el enfoque basado en el constructor, aunque quizás parezca trivial al principio, la serialización (de) puede convertirse en un proceso complejo que podría agregar cada vez más código no específico de clase para las clases que necesitan serialización. En cambio, usaría las clases 'generador'/'analizador' (patrón de fábrica) para mantener las responsabilidades claras y las dependencias bajas.

5

No, la serialización de una matriz de subobjetos en línea dentro de un objeto principal no es particularmente desordenada o difícil si el código de deserialización sabe cómo leer eso. XML hace cosas así todo el tiempo. También lo hace el formato DFM, y funciona genial.

No hay magia involucrada. Todos los datos necesarios para recrear todo el estado del objeto deben pasar del remitente al receptor de una forma u otra. Siempre que el serializador y el deserializador hablen el mismo protocolo, y el receptor pueda recrear el mismo objeto enviado por el remitente, entonces su código está funcionando bien y no necesita ser modificado a menos que cause problemas significativos de rendimiento .

Además, WRT su pequeña enmienda, si el propósito de TBest.fromString es crear un nuevo objeto TBest, entonces debe declararse como constructor, no es algo estático. Esa es una de las cosas buenas de Delphi: podemos darles a nuestros constructores nombres reales y descriptivos. "Crear" es solo una convención.

+0

+1 por la sugerencia del constructor. Si lo hubiera pensado un poco más, espero que haya terminado así. ;-) –

+0

+1 para la sugerencia del constructor también .D no vio que, aunque es muy obvio .D – Acron

0

Serializamos objetos utilizando una clase base TStreamable. Estas clases no son para nada más que el transporte de información entre capas/capas en una aplicación cliente/servidor DCOM.

La clase base sabe cómo serializar una secuencia Delphi regular desde y hacia una matriz variante de bytes. Los métodos de interfaz en la interfaz DCOM toman parametros variantes donde queremos pasar objetos complejos entre el cliente y el servidor.

También mantenemos nuestras versiones de cliente y servidor sincronizadas, por lo que no tenemos problemas de versiones entre las diferentes versiones de cliente y servidor.

Por lo tanto, cada subclase simplemente lee y escribe a/desde un flujo Delphi, y la clase base lo serializa en una variante.

Para las colecciones de otros objetos, para nosotros, es tan simple como el objeto principal escribir el recuento de objetos contenidos en la secuencia, y luego pedir a cada objeto contenido que se añada a la misma secuencia. Y simplemente invierta el proceso en el otro extremo. No hace falta decir que las clases contenidas también heredan de nuestra clase TStreamable base.

5

¿Revisó los marcos remotos n-tier ya disponibles para Delphi? Me acuerdo de:

Estos marcos son más de 5 años en el mercado, para que pueda obtener todos los detalles feos ya resuelto y probado.

Editar : a un comentario acerca de los precios:

  • DataSnap se incluye en las versiones Enterprise y Architect de Delphi. Si tiene uno de esos, entonces es "gratis", si tiene Delphi Professional, le costará.
  • kbmMW tiene una edición gratuita (compruebe su sitio)
+0

Se recomiendan los gratuitos. ¿DataSnap es gratis? – Acron

+0

Tenga en cuenta que Datasnap viene en dos formas: 1) El basado en DCOM anterior (ofrece autenticación/autorización/cifrado, pero puede ser complejo de configurar, especialmente sin un dominio AD) 2) Los nuevos basados ​​en dbExpress/TCP/HTTP. Tal vez más fácil de usar, pero carece de cualquier característica de seguridad. Delphi también es compatible con SOAP. –

1

Utilizamos HitXML (open source), que hace todo (de) la serialización de forma automática (usando RTTI): http://code.google.com/p/hitxml/

funciona bien, siempre y cuando se usan métodos publicados (RTTI), y también se puede utilizar las propiedades de "array of TRTTIEnabled".

Cuestiones relacionadas