2 <TITLE>File: objetopersistente.pas </TITLE>
\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">
\r
5 <BODY BGCOLOR="#FFFFFF">
\r
6 <A NAME=objetopersistente.pas><CENTER><H3>objetopersistente.pas</H3></A><I> from <A HREF=/proyecto/doc/src-html/AlgoWars.html> Project: AlgoWars.dpr</A></I></CENTER>
\r
9 <I><FONT COLOR="Navy">{** Es una clase abstracta para hacer persistente un objeto.
\r
10 Básicamente provee métodos para serialización.<br>
\r
13 Es importante que el ID del objeto sea el primer atributo en la
\r
14 serialización, de otra manera puede ser malinterpretado al des-
\r
16 El orden del resto de los atributos deben ser respetados también.
\r
17 Aunque es bastante probable que fucione si están en otro órden,
\r
18 no está 100% asegurado y si se hace en otro orden los resultados
\r
19 pueden ser inesperados o pueden surgir errores.
\r
21 <B>unit</B> ObjetoPersistente;
\r
26 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
28 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
32 <I><FONT COLOR="Navy">{** Excepcion producida si hay un error al serializar.}</FONT></I>
\r
33 ESerializacion = <B>class</B>( Exception )
\r
36 <I><FONT COLOR="Navy">{** Es una clase abstracta para hacer persistente un objeto.
\r
37 Básicamente provee métodos para serialización.
\r
38 NOTA: Es importante que el ID del objeto sea el primer atributo en la
\r
39 serialización, de otra manera puede ser malinterpretado al des-
\r
40 serializarlo.}</FONT></I>
\r
41 cObjetoPersistente = <B>class</B><I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>( cObjeto )<I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
43 aID: <B>string</B>; <I><FONT COLOR="Navy">// Identificación UNICA de la instancia </FONT></I>
\r
45 <I><FONT COLOR="Navy">{** Setea la identificacion del objeto}</FONT></I>
\r
46 <B>procedure</B> <A HREF="#cObjetoPersistente.mSetID">mSetID</A>( id: <B>string</B> );
\r
48 <I><FONT COLOR="Navy">{** Constructor. Setea el ID.}</FONT></I>
\r
49 <B>constructor</B> create;
\r
50 <I><FONT COLOR="Navy">{** Constructor que crea el objeto a partir de una cadena de texto con
\r
51 el objeto serializado.}</FONT></I>
\r
52 <B>constructor</B> crearDeSerializado( str: <B>string</B> );
\r
53 <I><FONT COLOR="Navy">{** Obtiene la identificacion del objeto}</FONT></I>
\r
54 <B>function</B> <A HREF="#cObjetoPersistente.mGetID">mGetID</A>: <B>string</B>;
\r
55 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.}</FONT></I>
\r
56 <B>function</B> <A HREF="#cObjetoPersistente.mSerializar">mSerializar</A>: <B>string</B>; <B>virtual</B>;
\r
57 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
58 serializado.}</FONT></I>
\r
59 <B>procedure</B> <A HREF="#cObjetoPersistente.mDesSerializar">mDesSerializar</A>( str: <B>string</B> ); <B>virtual</B>;
\r
62 <B>implementation</B>
\r
67 <I><FONT COLOR="Navy">{ cObjetoPersistente }</FONT></I>
\r
69 <I><FONT COLOR="Navy">{** Constructor que crea el objeto a partir de una cadena de texto con
\r
70 el objeto serializado.
\r
71 @param str cadena de texto con el objeto serializado.}</FONT></I>
\r
72 <B>constructor</B> cObjetoPersistente.crearDeSerializado(str: <B>string</B>);
\r
74 <B>inherited</B> create; <I><FONT COLOR="Navy">// Llama al create padre </FONT></I>
\r
75 mDesSerializar( str ); <I><FONT COLOR="Navy">// Deserializa los datos </FONT></I>
\r
78 <I><FONT COLOR="Navy">{** Constructor. Setea el ID.}</FONT></I>
\r
79 <B>constructor</B> cObjetoPersistente.create;
\r
82 aID := IntToHex( integer( self ), 6 );
\r
85 <I><FONT COLOR="Navy">{** Obtiene la identificacion del objeto
\r
86 @return ID del objeto.}</FONT></I>
\r
87 <B>function</B> <A NAME=cObjetoPersistente.mGetID>cObjetoPersistente.mGetID</A>: <B>string</B>;
\r
92 <I><FONT COLOR="Navy">{** Setea la identificacion del objeto
\r
93 @param id nuevo ID.}</FONT></I>
\r
94 <B>procedure</B> <A NAME=cObjetoPersistente.mSetID>cObjetoPersistente.mSetID</A>(id: <B>string</B>);
\r
99 <I><FONT COLOR="Navy">{** Devuelve una cadena de texto con el objeto serializado.
\r
100 @return Cadena de texto con el objeto serializado.}</FONT></I>
\r
101 <B>function</B> <A NAME=cObjetoPersistente.mSerializar>cObjetoPersistente.mSerializar</A>: <B>string</B>;
\r
103 result := '<id>' + aID + '</id>';
\r
106 <I><FONT COLOR="Navy">{** Recrea el objeto a partir de una cadena de texto con el objeto
\r
108 @param str Cadena de texto con el objeto serializado.}</FONT></I>
\r
109 <B>procedure</B> <A NAME=cObjetoPersistente.mDesSerializar>cObjetoPersistente.mDesSerializar</A>(str: <B>string</B>);
\r
113 r := TRegExpr.create;
\r
114 <B>try</B> <I><FONT COLOR="Navy">// prueba que no haya errores con las expresiones regulares </FONT></I>
\r
115 r.Expression := '<id>/s*([ABCDEFabcdef0-9]{6})/s*</id>';
\r
116 <B>if</B> r.Exec ( str ) <B>then</B>
\r
119 <B>raise</B> ESerializacion.create( 'No se encontro el ID del Objeto' );
\r
121 on e: ERegExpr <B>do</B> <B>begin</B>
\r
123 <B>raise</B> ESerializacion.create( ClassName + ': Error al extraer el ID utilizando expresiones regulares: ' + e.<B>Message</B> );
\r