Serialização XML em Dispositivos Móveis (Android)

Durante a realização de um projeto na Mobiltec, nos deparamos com o seguinte desafio: serializar (XML) um objeto em .NET e deserializar o mesmo objeto em um dispositivo Android (Java). No .NET Framework (C#) a operação de serialização é bem trivial, basta executar o seguinte código exemplo:

System.Xml.XmlSerializer xmlSr = new XmlSerializer(typeof(Model));
Model model = new Model();
xmlSr.Serialize(stream, model);

O processo de deserialização é igualmente fácil:

Model udtModel = (Model)xmlSr.Deserialize(stream);

Por exemplo, a seguinte classe Model

using System.Collections.Generic;
public class Model
{
     public bool IsValid { get; set; }
     public int Identifier { get; set; }
     public string SomeText { get; set; }
}

irá gerar esse XML:

<?xml version="1.0" encoding="utf-8"?>
<Model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <IsValid>false</IsValid>
  <Identifier>134</Identifier>
  <SomeText>text</SomeText>
</Model>

Algumas observações importantes na serialização de objetos em .NET:

  • Não é necessário nenhuma preparação inicial do objeto a ser serializado (Model)
  • Não é necessário marcar a classe como serializável (modificador [Serializable])
  • Todos os atributos que serão serializados devem ser públicos (a classe Model inclusive), senão o método Serialize gera uma exceção (“XMLSerializationTest.Model é inacessível por causa do seu nível de proteção. Apenas tipos públicos podem ser processados.”)

No Android não temos nada que o próprio Framework do Java tenha que seja tão simples quanto o .NET, apenas o básico de leitura de XML está presente. Entretanto, em outros projetos desenvolvidos na Mobiltec utilizando a linguagem Java (mais especificamente J2EE), observamos que existiam algumas bibliotecas que auxiliam na serialização de objetos, similar ao .NET, como o JAXB. Conforme vimos no post sobre desenvolvimento em Android, não é qualquer código em Java que irá funcionar no Android. A bibliteca JAXB poderia ser utilizada, porém estávamos em busca de algo mais leve e encontramos a excelente biblioteca Simple. O jar da biblioteca JAXB tem aproximadamente 10,4 Mb, já a biblioteca Simple tem apenas 360 Kb. Para deserializar o XML gerado anteriormente, utilizando a biblioteca Simple, basta gerar o seguinte código:

import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;

Serializer serializer = new Persister();
Model model = serializer.read(Model.class, source);

Observações importantes da biblioteca Simple:

  • Os atributos da classe são utilizados para serializar/deserializar o objeto
  • Ao recriar a classe Model em Java, esta deve ter atributos com o mesmo nome das propriedades do .NET para que a correspondência possa ser feita
  • O Simple é case sensitive, ou seja, a seguinte classe deve ser definida para que a importação exemplificada neste post funcione:
    import org.simpleframework.xml.Default;
    
    @Default
    public class Model {
    
    	private boolean IsValid;
    	private int Identifier;
    	private String SomeText;
    
            //metodos get/set omitidos
    }

Com este dois exemplos observamos uma certa dependência entre as classes Model definidas. Como uma dica de utilização podemos realizar algumas marcações nas duas classes de forma a padronizar o XML gerado, facilitando a importação em qualquer outra plataforma. Em .NET podemos fazer o seguinte com a classe Model:

[XmlRootAttribute("model")]
public class Model
{
    [XmlElement("valid")]
    public bool IsValid { get; set; }

    [XmlElement("identifier")]
    public int Identifier { get; set; }

    [XmlElement("someText")]
    public string SomeText { get; set; }
}

A biblioteca Simple também permite as mesmas marcações:

@Root(name="model")
public class Model {

	@Element(name="valid")
	private boolean valid;

	@Element(name="identifier")
	private int identifier;

	@Element(name="someText")
	private String someText;

        //metodos get/set omitidos propositalmente
}

Era isso por hoje e aguardem em breve mais um post com mais dicas sobre serialização utilizando a biblioteca Simple. Caso tenha ficado curioso sobre a utilização do JAXB, este site mostra uma comparação entre Simple e o JAXB.

Escrito por Paulo Sérgio Morandi