Blog do Urubatan
msgbartop
Desenvolvedor, Palestrante, Escritor, Nerd Assumido e Pai do Marcus :D
msgbarbottom

06 Nov 07 Flex2/ActionScript 3 – Transformando objetos em XML

Trabalhando com Flex com um backend em Java, cheguei a conclusão que a melhor alternativa para o projeto seria simplesmente fazer posts de dados do flex para o java e receber XML de volta (o Flex trabalha muito bem com XML).
Mas tem um problema nisto, passar um ou dois valores desta forma é bastante fácil, mas quando eu precisava passar objetos complexos era muito chato passar milhares de parâmetros para uma URL, então tive a idéia de mandar também XML de volta para o Java …
desta forma, o único problema que continuou foi eu precisar escrever manualmente o XML para cada post, sendo que na maioria das vezes eu ja tinha um objeto Flex …
Solucionei isto com uma pequena função utilitária que transforma qualquer objeto em XML, tentei procurar alguma coisa na API padrão, mas não encontrei nada, então escrevi isto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package teste
{
	import mx.utils.ObjectUtil;
 
	public class Utils
	{
		public static function objectToXml(obj : Object, name : String) : XML{
			var result : XML;
			var info:Object = ObjectUtil.getClassInfo(obj);
			if(name==null)
				name = info.name;
			result = new XML("<" + name + "></"+ name + ">");
			for each (var qn : QName in info.properties){
				var val : Object = obj[qn.toString()];
				if(ObjectUtil.isSimple(val))
					result[qn.toString()] = val;
				else
					result.appendChild(objectToXml(val,qn.toString()));
			}
			return result;			
		}
	}
}

Para usar também é bem fácil:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="appInit()">
<mx:Script>
	<![CDATA[
		import teste.Utils;
		import mx.utils.ObjectUtil;
		import mx.controls.Alert;
		public function appInit() : void {
			var obj : Object = {name:'teste',address:{street:'rua',number:20}};
			Alert.show(Utils.objectToXml(obj,'teste').toXMLString());
		}
	]]>
</mx:Script>
 
</mx:Application>

e o XML gerado no exemplo é este:

1
2
3
4
5
6
7
<teste>
  <address>
    <number>20</number>
    <street>rua</street>
  </address>
  <name>teste</name>
</teste>

Bom, não sei se esta é a melhor forma de se trabalhar, mas até que gostei da solução :D

If you enjoyed this post, make sure you subscribe to my RSS feed!

Tags: , , ,

Reader's Comments

  1. |

    aeee, cara realmente muito legal e útil esse seu post =D

    Reply to this comment
  2. |

    Tchê, na real a melhor forma pra tu fazer isto é trabalhar com Remote Object ou Data Service no flex, neste caso tu cria um pojo no lado flex que reflete teu objeto do lado java e diz pra ele que ele é remote, desta forma tu não precisa construir nada de parser de xml, trabalha diretamente com os objetos.
    O Flex funciona muito bem desta forma, estou desenvolvendo todo um ECM com flex, java no Backend e JSR 168, e está indo igual a um “Dodge morro abaixo”!!
    Bueno, se tu precisares de mais detalhes sobre esta implementação, pregue um grito!!

    []´s

    Reply to this comment
  3. |

    Éverton, eu concordo contigo, mas o Data Service não é uma opção para este projeto :(

    Reply to this comment
  4. |

    Cara…muito bom..a função ficou ótima e bem simples….parabéns

    Reply to this comment
  5. |

    Discordo, e cocordo com o Éverton, XML é texto, a adobe desenvolveu o protocolo AMF (RemoteObject), justamente para melhorar a comunicação dos dados, uma vez que o AMF provê compactação e tranferência binaria.

    Outra… com RemoveObeject, você trabalha como se o Flex chamasse diretamente os métodos java, o que lhe abstrai de ficar fazendo essas classes uteis.

    Lembrando também que existe vários Frameworks OpenSource que implementam o AMF 3, como GraniteDataService, OpenAMF, WebOrb, e o mais recém, e acredito definitivo: o BlazeDS, desenvolvido pela própria Adobe, que além de implementar o RemoteObject, implementa o DataPush.

    ver: http://www.adobe.com/devnet/flex/articles/datapush.html

    Esse sim é o canal, acredito que qualquer framework que se baseia em html hoje, está longe de realizar o DataPush.

    Dica dada,
    Abraços!
    \o/

    Reply to this comment
  6. |

    Olá, gostaria de saber se existe o caminho inverso, quero transformar os dados do amf pra xml. Eu consigo acesso direto ao banco, mas só me retorna strings, quero tranformar essa string em um xml. Isso é possível?
    Abs

    Reply to this comment

Leave a Comment