Para todos aquellos que ya están desarrollando en DataSnap como para todos los que recién comienzan, conocemos que el retorno de funciones en desarrollos cliente / servidor es muy limitado, y sobre todo, a lo que se refiere en el retorno de objetos de usuarios.
Actualmente, ya es posible pasar objetos de usuario entre aplicaciones cliente / servidor utilizando objetos tipo JSON.
Se basa en codificar los objetos de usuarios en objetos tipo JSON, transportarlos y luego volver a codificarlos en objetos de usuarios en el lado opuesto.
Para ello, DataSnap nos proporciona una suite de serialización en la unidad DBXJSONReflect con la clase TTypeMarshaller.
TJSONMarshal y TJSONUnMarshal son dos implementaciones que nos permiten codificar y decodificar objetos de usuarios a objetos tipo JSON.
Pero ojo, no todos los objetos de usuarios se pueden serializar, pueden existir, para los tipos de datos complejos, se deben realizar convertidores personalizados.
El siguiente ejemplo, es una clase sencilla que serializamos para ser transportada como objeto JSON:
Unit UUserObjects;
..
{ User Object }
TUserObject = class
private
public
Number: integer;
Height: integer;
Time: DateTime;
constructor Create;
end;
...
constructor TUserObject.Create;
begin
Number := 0;
Heigth := 0;
Time := now();
end;
El objeto anterior debe estar instanciado tanto en el Servidor como en el Cliente para poder llevar a cabo la serialización.
A continuación, generamos la función que envía el objeto serializado:
Uses UUserObjects, Data.DBXJSON, Data.DBXJSONReflect;
...
function TServerMethods1.SendObject(): string;
var
Obj: TUserObject;
JM: TJSONMarshal;
begin
Obj := TUserObject.Create;
Obj.Number := 10;
Obj.Height := 55;
Obj.Time := now();
{ Serialization }
JM := TJSONMarshal.Create(TJSONConverter.Create);
Result := JM.Marshal(vConfig).ToString;
end;
Desde el lado opuesto, recibimos este objeto JSON y lo decodificamos para generar el objeto de usuario nuevamente:
Uses UUserObjects, Data.DBXJSON, Data.DBXJSONReflect;
...
procedure ReceiveObject;
var
JUM: TJSONUnMarshal;
ResultStr: string;
Obj: TUserObject;
begin
with GetObjectProc do
begin
Close;
Prepare;
ExecProc;
end;
ResultStr := GetObjectProc.ParamByName('ReturnValue').AsString;
JUM := TJSONUnMarshal.Create;
Obj:= JUM.Unmarshal(TJSONObject.ParseJSONValue(ResultStr))
as TUserObject;
ShowMessage(IntToStr(Obj.Number) + ' ' + IntToStr(Obj.Height) + ' ' + DateTimeToStr(Obj.Time) );
end;
Espero que les haya servido, y espero sus comentarios.