Skip to content

DataSnap – Serialización de Objetos de usuario

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.