Arquivo
Serialization .NET
Olá pessoal, hoje eu vou falar sobre serialização de dados com o .NET. Para quem não sabe oque é serialização pense na seguinte situação, você precisa transferir uma coleção de objetos de sua aplicação para outra aplicação através da rede. Para fazer isso você precisaria transformar sua coleção em um XML e enviar para a outra aplicação. Este processo de transformação da coleção de objetos para um XML pode ser considerado uma serialização.
Dentro do namespace System.Runtime.Serialization.Formatters.Binary você tem a classe BinaryFormatter que nos permite transformar dados de nossa aplicação (string, coleção de objetos e etc.) em um arquivo binário serializado. Segue abaixo um exemplo de como serializar uma string.
- FileStream fileStream = new FileStream("ArquivoBinarioSerializado", FileMode.CreateNew);
- BinaryFormatter binFtr = new BinaryFormatter();
- binFtr.Serialize(fileStream, "franciscogoncalves.wordpress.com");
- fileStream.Close();
Na primeira linha eu criei um FileStream para criar um arquivo com o nome de “ArquivoBinarioSerializado”. Na segunda linha eu instanciei a classe BinaryFormatter. Na terceira linha é que a serialização realmente acontece. Estou dizendo para que a string “franciscogoncalves.wordpress.com” seja serializada dentro do arquivo que estou criando com o FileStream. Na última linha apenas chamo o método close do FileStream. Se você pode verificar na pasta raiz de seu projeto que um arquivo com dados serializados foi criado. E para deserializar utilize o seguinte exemplo.
- FileStream fileStream = new FileStream("ArquivoBinarioSerializado", FileMode.Open);
- BinaryFormatter binFtr = new BinaryFormatter();
- string data = (string)binFtr.Deserialize(fileStream);
- fileStream.Close();
- Console.WriteLine(data);
A diferença entre o primeiro trecho de código e o segundo é que no segundo o FileStream está com o FileMode configurado para abrir um arquivo ao invés de criar. Na terceira linha estou chamando o método Deserialize passando como parâmetro o FileStream. É muito importante que você saiba qual é o tipo do conteúdo do arquivo. No caso eu sei que o conteúdo do arquivo é uma string, por isso eu faço um cast para string. E na última linha eu exibo o resultado. Você pode verificar que o conteúdo é exatamente o mesmo que eu havia serializado no exemplo anterior.
A serialização binária é muito útil quando precisamos trafegar dados entre aplicações .NET, porém quando precisamos trafegar informações para outro tipo de plataforma utilizamos a serialização Soap que é baseado em XML. Para utilizar adicione o assembly System.Runtime.Serialization.Formatters.Soap e utilize os seguintes exemplos para para:
Serializar
- FileStream fileStream = new FileStream("ArquivoSoapSerializado", FileMode.CreateNew);
- SoapFormatter soapFtr = new SoapFormatter();
- soapFtr.Serialize(fileStream, "franciscogoncalves.wordpress.com");
- fileStream.Close();
Deserializar
- FileStream fileStream = new FileStream("ArquivoSoapSerializado", FileMode.Open);
- SoapFormatter soapFtr = new SoapFormatter();
- string data = (string)soapFtr.Deserialize(fileStream);
- fileStream.Close();
- Console.WriteLine(data);
Você pode perceber que o arquivo gerado tem uma formatação diferente quando utilizamos o SoapFormatter.
Você também pode serializar suas próprias classes, basta que você a decore com o atributo Serializable. Segue abaixo um exemplo.
- [Serializable]
- public class Pessoa
- {
- public int idPessoa { get; set; }
- public string nome { get; set; }
- public int idade { get; set; }
- public int anoNascimento { get; set; }
- }
E para você serializar ou deserializar basta usar os exemplos acima trocando a string pela seu objeto.
O Serialization permite que você configure como a serialização da classe pode funcionar. Por exemplo, caso você tenha duas versões diferente da classe Pessoa você pode utilizar o atributo OptionalField na propriedade escolhida. Isto significa que poderá serializar/deserializar de uma classe para outra mesmo que não exista a propriedade em uma delas.
- [OptionalField]
- public int idPessoa { get; set; }
Outro atributo interessante é o NonSerialized que indica que esta propriedade não será serializada. Veja abaixo um exemplo.
- [NonSerialized]
- public int anoNascimento { get; set; }
Você também pode controlar como será a deserialização. Por exemplo: a propriedade anoNascimento não será serializada, porém eu posso calcular este valor no momento da deserialização implementando a Interface IDeserializationCallback.
- [Serializable]
- public class Pessoa : IDeserializationCallback
- {
- public int idade { get; set; }
- [NonSerialized]
- public int anoNascimento { get; set; }
- public void OnDeserialization(object sender)
- {
- anoNascimento = DateTime.Now.Year – idade;
- }
É isso ai pessoal, espero que tenham gostado do artigo e espero que ele tenha sido útil. Até o próximo.