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
Modelinclusive), senão o métodoSerializegera 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
Modelem 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



