DataSnap 2010 – Enviando e recebendo objetos
Uma das perguntas frequentes dos usuários de Delphi 2009 e que utilizam DataSnap para criação de objetos é sobre a transferência de objetos entre cliente e servidor. No DataSnap 2009 estavamos limitados aos data types do dbxExpress, agora com o DataSnap 2010 que acompanha o Delphi 2010, isso é totalmente possível.
DataSnap 2010 traz o suporte a JSON (JavaScript Object Notation) que é uma formatação leve de troca de dados, totalmente independente de linguagem, futuramente vou comentar mais sobre JSON e suas vantagens, para começar este post irá mostrar como transferir objetos entre cliente e servidores DataSnap, sendo que ambos cliente e servidor são aplicações Delphi.
Para começar vamos definir uma classe chamada TCustomer.
unit Customer;
interface
uses
DBXJSON, DBXJSONReflect, SysUtils;
type
TMaritalStatus = (msMarried, msEngaged, msEligible);
TCustomer = class
private
FName: string;
FAge: integer;
FMaritalStatus: TMaritalStatus;
public
property Name: string read FName write FName;
property Age: integer read FAge write FAge;
property MaritalStatus: TMaritalStatus read FMaritalStatus write FMaritalStatus;
function toString : string;override;
end;
Para transferir objetos em DataSnap estes devem descender the TJSONObject, no caso de não ser um objeto descendente você terá que utilizar as classes TJSONMarshal e TJSONUnMarshal para efetuar a transformação dos objetos. Sendo assim os métodos abaixo irão efetuar a conversão dos mesmos.
unit Customer;
function CustomerToJSON(customer: TCustomer): TJSONValue;
var
m: TJSONMarshal;
begin
if Assigned(customer) then
begin
m := TJSONMarshal.Create(TJSONConverter.Create);
try
exit(m.Marshal(customer))
finally
m.Free;
end;
end
else
exit(TJSONNull.Create);
end;
function JSONToCustomer(json: TJSONValue): TCustomer;
var
unm: TJSONUnMarshal;
begin
if json is TJSONNull then
exit(nil);
unm := TJSONUnMarshal.Create;
try
exit(unm.Unmarshal(json) as TCustomer)
finally
unm.Free;
end;
end;
Com isso temos classe TCustomer pronta para trafegar entre cliente e servidor, assim sendo basta implementar um Server Method que retorne um TJSONValue a partir da transformação de TCustomer, como o exemplo abaixo.
// protected function TServerMethods.GetCustomer: TCustomer; begin Result := TCustomer.Create; Result.Name := 'Pedro'; Result.Age := 30; Result.MaritalStatus := msEligible; end; // public function TServerMethods.GetJSONCustomer(): TJSONValue; var myCustomer: TCustomer; begin myCustomer := GetCustomer; Result := CustomerToJSON(myCustomer); myCustomer.Free; end;
No lado cliente ao executar o método GetJSONCustomer será necessário efetuar a transformação de TJSONValue para TCustomer, utilizando o método JSONToCustomer.
var
proxy: TServerMethodsClient;
myJSONCustomer: TCustomer;
begin
try
proxy := TServerMethodsClient.Create(SQLConnection1.DBXConnection);
myJSONCustomer := JSONToCustomer(proxy.myJSONCustomer);
Button1.Caption := myJSONCustomer.ToString;
myJSONCustomer.Free;
finally
SQLConnection1.CloneConnection;
proxy.Free;
end;
end;
Muito mais pode ser feito, como retornar Arrays de objetos, classes mais complexas, etc. Estarei abordando estes temas em futuros posts.
Download do código fonte










Developer Network
6 Comentários
2009-09-25
19:27:37
[...] Setembro 25, 2009 por marlonsouza Agora, no Delphi 2010, é possível transferir objetos entre entre clientes e servidores DataSnap. Leia mais a respeito no endereco http://www.andreanolanusse.com/blogpt/datasnap-2010-enviando-e-recebendo-objetos/ [...]
2009-09-26
09:28:48
[...] sequência ao tema transferência de objetos com DataSnap o qual iniciei escrevendo sobre a transferência de um simples objeto, o qual é pré-requisito para entender este artigo, neste post descrevo como transferir uma lista [...]
2009-10-09
01:27:52
Olá Andreano, bem interessante esses novos recursos do Delphi 2010, a minha licença do novo Delphi deve estar chegando nessa semana, já estou aqui pirando para poder escrever meus serviços com datasnap. Alguns dias atrás eu escrevi um mini-artigo sobre exportação de dados de um dataset para um arquivo JSON utilizando versões anteriores ao Delphi 2010, utilizei a biblioteca lkjson, q é opensource. Se tiver interesse, segue meu blog: http://www.eversonnovka.com
[]'s
2009-10-11
07:37:45
[...] sequência ao tema transferência de objetos com DataSnap o qual iniciei escrevendo sobre a transferência de um simples objeto, e depois sobre o envio de array objetos, agora vamos descrever como enviar array que contenha [...]
2009-10-20
02:14:42
Oi Everson, não conheço em detalhes esta biblioteca mas parece interessante
2009-11-28
23:58:50
Caro Andreano,
Ótimo post parabéns.
Uma pequena dúvida: Há algo pronto, no delphi 2010, para enviar/receber objetos mais complexos como por exemplo um TClientDataSet?
Obrigado.