Esse artigo faz parte da revista Java Magazine edição 52. Clique aqui para ler todos os artigos desta edição 

img

Clique aqui para ler esse artigo em PDF. imagem_pdf.jpg

 

De Objetos a XML e Vice-Versa

Persistindo JavaBeans através de APIs de serialização

 

Sabemos que a tecnologia XML é usada em aplicações com as naturezas mais diversas, para armazenamento de configurações, troca de dados entre aplicativos, exportação/importação... Documentos XML podem também servir para a persistência, em algumas situações substituindo bem um banco de dados local como HSQLDB ou Derby. Esse é o caso, por exemplo, do programa do Imposto de Renda Pessoa Física, usado anualmente por milhões de pessoas, que durante o preenchimento de uma declaração IRPF armazena em XML as informações digitadas.

Mas habituado a trabalhar com objetos, o programador Java comumente precisa aprender diferentes – e às vezes complicadas – abordagens para usar XML em suas aplicações. A boa notícia é que existem APIs de serialização de objetos, que se encarregam de cuidar das transformações de/para XML. A serialização é o processo de gravar um objeto em um meio de armazenamento (como um arquivo) ou transmiti-lo por uma conexão de rede, seja em forma binária ou em formato de texto como o XML.A desserialização é o processo inverso, de recriar o objeto a partir do XML com o mesmo estado interno que o original.

Nesse artigo veremos duas APIs para a serialização de objetos usando XML. Vamos apresentar as vantagens e desvantagens de cada uma, para que o desenvolvedor possa escolher a que mais se adapta às suas necessidades. Usar essas soluções pode simplificar bastante o uso de XML com Java e abrir novas possibilidades para o armazenamento de dados em suas aplicações.

 

Uso tradicional de XML em aplicações

Sistemas escritos em Java costumam usar duas abordagens básicas para ler e gravar arquivos XML. A primeira é através de APIs como o SAX (Simple API for XML), com as quais é possível processar arquivos XML de forma seqüencial. À medida que o documento é lido, são disparados eventos (por exemplo, ao iniciar cada elemento ou atributo) para que a aplicação possa processá-los. Outra opção nessa linha é o StAX (Streaming API for XML), que oferece boa performance e maior facilidade de uso em relação ao SAX. Ambas as APIs são recomendadas para arquivos grandes, pelo seu baixo consumo de recursos, já que o documento não é carregado inteiro em memória de uma única vez.

A segunda abordagem é baseada no DOM (Document Object Model), que é um padrão de representação de XML em objetos organizados hierarquicamente1. Uma árvore de objetos é criada em memória, de forma a permitir acesso direto a um determinado elemento ou atributo, usando a notação XPath. Essa é uma opção normalmente mais fácil de ser utilizada (se dessecomparada a SAX e StAX), porém consome mais memória e não é aconselhável para arquivos muito grandes.

As duas abordagens (SAX/StAX e DOM), no entanto, exigem conhecimentos adicionais para o programador, que precisará dominar nuances de cada uma para escolher a melhor opção em seu caso (em termos de performance, facilidade de uso, flexibilidade etc.).

Nesse contexto, surge a alternativa de serializar e desserializar objetos Java de/ para XML. Com essa técnica, o desenvolvedor continua trabalhando com seus objetos Java e tira proveito de bibliotecas que realizam todo o trabalho de transformação.

 

Nota 1: Existem implementações de DOM para diversas linguagens além de Java, como PHP, Python, Perl e Visual Basic. A padronização é importante porque o programador que utiliza DOM sabe que encontrará a mesma hierarquia de objetos em qualquer linguagem que utilizar.

 

O exemplo

Para avaliar as opções de serialização XML apresentadas, serão utilizados objetos Java para um cadastro de clientes, conforme o diagrama de classes apresentado na Figura 1. A proposta do exemplo é ilustrar o uso mais comum de serialização para XML, com as duas APIs. O códigofonte de cada uma das classes é mostrado na Listagem 1.

 

img

Figura 1. Diagrama de classes do exemplo

 

Listagem 1. JavaBeans do exemplo, preparados para serialização usando o Simple (package e imports omitidos, da segunda classe em diante)

 

Classe Cadastro

package jm.serializacaoxml.simple.beans;

import org.simpleframework.xml.*;

import java.util.*;

@Root

public class Cadastro implements Serializable {

@ElementList(inline=true)

private List clientes;

 

// ... construtores e get/set omitidos

}

 

Classe Cliente

@Root

public class Cliente implements Serializable {

@Attribute

private String cpf;

@Element

private String nome;

@Element(required=false)

private String apelido;

@Element(name=»data-nascimento»)

private String dataNascimento;

@Element

private Telefones telefones;

@ElementList(parent=”e-mail”, inline=true, required=false)

private List emails;

// ... construtores e get/set omitidos

}

 

Classe Telefones

@Root

public class Telefones implements Serializable {

...
Quer ler esse conteúdo completo? Tenha acesso completo