DataSnap + JSONARRAY

Delphi

15/06/2012

Galera,

Existe outro meio de se transferir colecoes do servidor para o cliente que nao seja usando JSONARRAY?
Minha ideia era usar algo como um DBXREADER, só que até onde sei, o DBXREADER só retorna dados de uma consulta SQL. O que quero é gerar manualmente esses dados e retorna-los.
Cleidson Silva

Cleidson Silva

Curtidas 0

Respostas

Marco Salles

Marco Salles

15/06/2012

Então , mas como sera o seu Client ???? Será em delphi tb ???
GOSTEI 0
Cleidson Silva

Cleidson Silva

15/06/2012

Sim, cliente e servidor em Delphi.
GOSTEI 0
Marco Salles

Marco Salles

15/06/2012

Estas coleções são de algum tipo ?? São nativas , são do tipo TDatapacker ?

Pq o Json tem dois métodos UnMarshal e o Marshal que ajuda muito neste tipo de transferencia

Vc trasforma o Objeto em Json -->> Envia

recebe -->> Converte o Json em Objeto

GOSTEI 0
Cleidson Silva

Cleidson Silva

15/06/2012

Eu uso a conversao em JSON, mas ainda assim, preciso enviar essa lista em um JSONARRAY, que creio que para 10 ou 20 itens é tranquilo, mas para uns 3000 itens, esse MARSHAL e UNMARSHAL toma um grande tempo.
O que estou enviando é uma classe simples, com uns 5 campos string;
GOSTEI 0
Marco Salles

Marco Salles

15/06/2012

Eu uso a conversao em JSON, mas ainda assim, preciso enviar essa lista em um JSONARRAY, que creio que para 10 ou 20 itens é tranquilo, mas para uns 3000 itens, esse MARSHAL e UNMARSHAL toma um grande tempo.
O que estou enviando é uma classe simples, com uns 5 campos string;


Então , mas parece que vc esta indo na contramão do que a tecnologia recemenda..

Mas vamos tentar mandar esses dados (coleção) atraves de OleVarint (formato TDataPAcker) ou mesmo
String (Formato TDataPacher) ... O que vc acha ???

GOSTEI 0
Cleidson Silva

Cleidson Silva

15/06/2012

Marco,

Desde já obrigado pelas dicas.

Não sou um expert em materia de DATASNAP e JSON. Se fazer a conversão dos objetos pra json e envia-los via JSONARRAY for mesmo a melhor forma, então eu já estou fazendo isso. Minha dúvida era se existiria ou não um método mais apropriado pra enviar uma coleção grande de objetos. Em um dos casos, eu troquei a coleção que estava enviando via JSONARRAY por um TDBXREADER e a diferença de performance foi muito grande. Mas nesse caso em especial, não posso usar o DBXREADER (ate onde sei).
A propósito, ainda não sei como usar TDATAPACKER e não achei nenhum material falando sobre o assunto. Teria alguma documentação ou exemplo ai? hehe.
GOSTEI 0
Marco Salles

Marco Salles

15/06/2012

A idéia não sei em termos de performance é montar um clientdatset no servidor

No servidor

Gravar os Objetos no Cds

Supor Objeto pessoa

Nome
endereco
CPF

Carregar um Cds onde cada registro é um Objeto

O que vc vai enviar sera o XMLData Deste Cds .. O XmlData é o TdataPacker em formato String , tem todos os registros

Bo cliente Vc ira receber este XmlData e carregar um ClientdataSet com a mesma estrutura do Cds do servidor que foi utilizado para montar

Logo vc faz o Processo inverso para ter os objetos desta Colecao

ps) Sinceramente , tem que ver a performance . Comece o exemplo com um Objeto Simples e faça-o funcionar , depois expanda o Modelo para a sua real necessidade ..
GOSTEI 0
Cleidson Silva

Cleidson Silva

15/06/2012

Segui sua orientação e criei os metodos abaixo. Na aplicacao cliente, gerei novamente os objetos e veja que interessante:
Usando JSONARRAY:
13 segundos para ler os dados e jogar num memo
10 segundos para ler somente em memoria

Usando CLIENTDATASET
3 segundos para ler os dados e jogar num memo
<1 segundo para ler somente em memoria

Ou seja, como eu havia suspeitado, JSONARRAY é legal pra pouca coisa, para uma quantidade maior de informações essa outra técnica que você sugeriu funciona muuuuuuuito melhor.
hehe. Valeu pela dica!!

function TServerMethods1.GetArrayPessoas: TJSONARRAY;
var
  p: tpessoa;
  I: Integer;
begin
  Result := TJSONARRAY.Create;
  for I := 1 to 3000 do
  begin
    p := tpessoa.Create;
    p.Nome := Pessoa: + inttostr(I);
    p.Endereco := Endereco: + inttostr(I);
    p.Telefone := (62) 9999-9999;
    Result.AddElement(tpessoa.ConvertToJson(p));
  end;
end;

function TServerMethods1.GetDataSetPessoas: string;
var
  p: tpessoa;
  I: Integer;
  c: tclientdataset;
begin
  try
    c := tpessoa.CreateDataSet;
    for I := 1 to 3000 do
    begin
      c.Insert;
      c.FieldByName(Nome).AsString := Pessoa: + inttostr(I);
      c.FieldByName(Endereco).AsString := Endereco: + inttostr(I);
      c.FieldByName(Telefone).AsString := (62) 9999-9999;
    end;
    c.Post;
    Result := c.XMLData;
  finally
    c.Free;
  end;
end;
GOSTEI 0
_nekinho_

_nekinho_

15/06/2012

Amigo mas tbm o que vc fez aqui foi covardia...

for I := 1 to 3000 do
begin
p := tpessoa.Create; <-- Ta criando o tempo todo tpessoa;
p.Nome := Pessoa: + inttostr(I);
p.Endereco := Endereco: + inttostr(I);
p.Telefone := (62) 9999-9999;
Result.AddElement(tpessoa.ConvertToJson(p));
end;

// Vai gera um vazamento d memoria graaaaaaaaaaaaaaande!
// Teoricamente JSON é para ser mais rápido que XML

Abraços
GOSTEI 0
Marco Salles

Marco Salles

15/06/2012

Para passar esta coleção de Objetos vc deve utilizar o TJSONArray

Vc pode destruir todos os Objetos Pessoa , porque o mesmo serão convertidos em String bem formatadas (Notação JSON)

O que pode estar ocasionando esta demorada seje a quantidade de mémoria ocupada , o computador tende a ser tonar mais lento

Qualquer dúvida montamos um exemplo

[]sds
GOSTEI 0
POSTAR