GARANTIR DESCONTO

Fórum DataSnap + JSONARRAY #418570

15/06/2012

0

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

Responder

Posts

15/06/2012

Marco Salles

Então , mas como sera o seu Client ???? Será em delphi tb ???
Responder

Gostei + 0

16/06/2012

Cleidson Silva

Sim, cliente e servidor em Delphi.
Responder

Gostei + 0

16/06/2012

Marco Salles

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

Responder

Gostei + 0

18/06/2012

Cleidson Silva

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;
Responder

Gostei + 0

18/06/2012

Marco Salles

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 ???

Responder

Gostei + 0

18/06/2012

Cleidson Silva

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.
Responder

Gostei + 0

18/06/2012

Marco Salles

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 ..
Responder

Gostei + 0

18/06/2012

Cleidson Silva

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;
Responder

Gostei + 0

21/06/2012

_nekinho_

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
Responder

Gostei + 0

21/06/2012

Marco Salles

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar