[Android] Ksoap: envio de lista de objetos

Olás,

Será que alguém teria algum exemplo de como enviar uma lista de objetos como parâmetro para uma operação de um WS feito em .net utilizando a API Ksoap2?

Consultei vários fóruns e tutoriais e ainda não consegui… Estou começando a ficar com o pé atrás, pois quase todo mundo tem problemas para enviar objetos e listas de objetos como parâmetros (com essa api)

Obrigado :wink:

A little bit of the google:

http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/102/The-Minimum-Steps-to-utilize-KSOAP2.aspx

[quote=pedrohms] A little bit of the google:

http://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/102/The-Minimum-Steps-to-utilize-KSOAP2.aspx[/quote]

Olá Pedro! Dei uma olhada neste artigo, mas ele não responde minha dúvida. Mas de qualquer forma, vlw.

Responde sim. Acho q sua duvida seria como serializar o objeto para envia-lo via web service. certo ?

Não. Pelos testes que fiz e pelo que vi, p/ enviar uma LISTA de objetos (que é o que eu preciso) não basta que estes objetos estejam serializados, sacou?

Pela experiencia que tenho com ksoap2 nao tive problemas em enviar objetos serializados vi WS. Se você poder enviar a mensagem de erro ajudaria.

Tenta com alguma implementaçao do JSON, como o Jackson ou GSON.

A ideia é simples: serializar um objeto, convertendo para String, para transportá-lo mais facilmente e do outro lado é só desserializá-lo, convertendo novamente no objeto original.

Exemplo com Jackson:

[code]ObjectMapper mapper = new ObjectMapper();
Pessoa pessoa = new Pessoa();

// Serializando
String s = mapper.writeValueAsString(pessoa);

// Transporta a String para o WS

// Desserializando
Pessoa pessoa = mapper.readValue(s, Pessoa.class);[/code]
Já passei um array de objetos (Pessoa[]) e funcionou perfeitamente. Para implementar com uma List o processo é praticamente o mesmo.

[quote=adrielcafe]Tenta com alguma implementaçao do JSON, como o Jackson ou GSON.

A ideia é simples: serializar um objeto, convertendo para String, para transportá-lo mais facilmente e do outro lado é só desserializá-lo, convertendo novamente no objeto original.

Exemplo com Jackson:

[code]ObjectMapper mapper = new ObjectMapper();
Pessoa pessoa = new Pessoa();

// Serializando
String s = mapper.writeValueAsString(pessoa);

// Transporta a String para o WS

// Desserializando
Pessoa pessoa = mapper.readValue(s, Pessoa.class);[/code]
Já passei um array de objetos (Pessoa[]) e funcionou perfeitamente. Para implementar com uma List o processo é praticamente o mesmo.[/quote]
Olá Adriel,

Usando uma implementação do JSON seria necessário alguma mudança no WebService?

[quote=maranata]
Usando uma implementação do JSON seria necessário alguma mudança no WebService?[/quote]

Você apenas precisa adicionar o Jar (no cliente e no WS) da implementação JSON. Não precisa alterar nada no WS, você apenas vai tá passando uma String de uma lado para o outro, serializando e desserializando. É tudo muito transparente.

[quote=adrielcafe][quote=maranata]
Usando uma implementação do JSON seria necessário alguma mudança no WebService?[/quote]

Você apenas precisa adicionar o Jar (no cliente e no WS) da implementação JSON. Não precisa alterar nada no WS, você apenas vai tá passando uma String de uma lado para o outro, serializando e desserializando. É tudo muito transparente.[/quote]

O problema é que o Web Service é feito em .net :cry:

Teria alguma outra sugestão?

Transportar strings não seria o problema certo? O problema seria qual implementação JSON usar, já que estamos falando e Java e .Net. No site do JSON, lá embaixo, tem uma lista de implementações pra C#, Visual Basic e diversas outras linguagens.

No Android você usaria uma API e no WS outra API que possuem o mesmo padrão de serialização: JSON. Dessa forma dá certo :smiley:

Acabei de fazer um teste transportando uma List<Categoria>, uma lista com POJOs, usando o Jackson e funcionou perfeito :slight_smile:

Fiz assim:

[code]// Serializando
ObjectMapper mapper = new ObjectMapper();

Categoria c1 = new Categoria();
Categoria c2 = new Categoria();
Categoria c3 = new Categoria();

// Populando os POJOs

List<Categoria> lista = new ArrayList<Categoria>();
lista.add(c1);
lista.add(c2);
lista.add(c3);

String s = mapper.writeValueAsString(lista);

// Desserializando
List<Categoria> cats = mapper.readValue(s, new TypeReference<List><Categoria>>() { });[/code]

A chave para desserializar com sucesso a List<Categoria> foi usar [color=blue]new TypeReference< List<Categoria> >() {}[/color] .