DataSnap + JSONARRAY
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.
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
Curtidas 0
Respostas
Marco Salles
15/06/2012
Então , mas como sera o seu Client ???? Será em delphi tb ???
GOSTEI 0
Cleidson Silva
15/06/2012
Sim, cliente e servidor em Delphi.
GOSTEI 0
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
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
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;
O que estou enviando é uma classe simples, com uns 5 campos string;
GOSTEI 0
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;
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
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.
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
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 ..
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
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!!
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_
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
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
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
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