Olá pessoal! Tudo bem? Nos últimos dias, estivemos estudando o uso do PCLExt.FileStorage para salvar e gerenciar arquivos e pastas locais em apps criados com Xamarin.Forms. Só que em todos os casos já explicados, os arquivos criados foram arquivos simples, de texto. Só que o PCLExt.FileStorage também pode ser usado para salvar objetos serializados como uma sequência de bytes. Vamos aprender como.
Como sempre, fique à vontade para baixar o código fonte deste artigo para estudos.
Em primeiro lugar, a classe cujos objetos serão serializados precisam ter o atributo [Serializable]
, como o exemplo abaixo. Isto não é nenhum recurso específico do Xamarin.Forms, é do .NET mesmo.
[Serializable] public class Model { public string Propriedade1 { get; set; } public string Propriedade2 { get; set; } }
A interface do app também é simples, com dois campos de texto Entry
, que serão usados para preencher as propriedades do objeto do tipo Model
que será serializado. Logo abaixo, dois botões para salvar e carregar as informações serializadas.
<Grid Padding="0,20,0,0"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="*" /> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Entry x:Name="Label1" Grid.Row="0" Placeholder="Digite aqui a propriedade 1" /> <Entry x:Name="Label2" Grid.Row="1" Placeholder="Digite aqui a propriedade 2" /> <Button Text="Salvar" Grid.Row="3" Clicked="ButtonSave_OnClicked"/> <Button Text="Carregar" Grid.Row="4" Clicked="ButtonLoad_OnClicked" /> </Grid>
No Code Behind, criamos duas propriedades. PastaRaiz, do tipo IFolder
, que representa a pasta local de arquivos do app, e Arquivo, do tipo IFile
, que representa o arquivo que vamos salvar e carregar. No construtor da página, instanciamos PastaRaiz como LocalRootFolder
e já criamos o Arquivo, com um nome aleatório.
public IFolder PastaRaiz { get; } public IFile Arquivo { get; } public MainPage() { InitializeComponent(); PastaRaiz = new LocalRootFolder(); Arquivo = PastaRaiz.CreateFile(Guid.NewGuid().ToString(), CreationCollisionOption.ReplaceExisting); }
O método ButtonSave_OnClicked
, chamado quando queremos salvar um novo Model
, primeiramente cria o objeto com as informações textuais que digitamos. Logo abaixo, criamos um BinaryFormatter
e um MemoryStream
para que o objeto seja serializado em memória. Ao final, usamos o método WriteAllBytesAsync
do Arquivo para escrever a versão serializada do Model
recém criado – um array de bytes.
private async void ButtonSave_OnClicked(object sender, EventArgs e) { var model = new Model { Propriedade1 = Label1.Text, Propriedade2 = Label2.Text }; var bf = new BinaryFormatter(); var ms = new MemoryStream(); bf.Serialize(ms, model); await Arquivo.WriteAllBytesAsync(ms.ToArray()); Label1.Text = string.Empty; Label2.Text = string.Empty; }
Já o método ButtonLoad_OnClicked
, chamado quando queremos carregar o arquivo, começa carregando o objeto serializado através do método ReadAllBytesAsync
do Arquivo. A partir daí criamos um MemoryStream
e um BinaryFormatter
e os usamos para desserializar o array de bytes carregados do arquivo e transformá-lo novamente num Model
, permitindo ler as propriedades digitadas inicialmente.
private async void ButtonLoad_OnClicked(object sender, EventArgs e) { var conteudo = await Arquivo.ReadAllBytesAsync(); var memStream = new MemoryStream(); var binForm = new BinaryFormatter(); memStream.Write(conteudo, 0, conteudo.Length); memStream.Seek(0, SeekOrigin.Begin); var model = (Model) binForm.Deserialize(memStream); Label1.Text = model.Propriedade1; Label2.Text = model.Propriedade2; }
Veja o resultado:


Como você pode perceber, não há nenhuma diferença prática entre salvar arquivos de texto e salvar informações serializadas com o PCLExt.FileStorage. E vale destacar também que a lógica de serialização e desserialização de objetos é do próprio .NET, e nem precisamos fazer adaptações para o código funcionar em apps Xamarin.Forms. Até a próxima!
[]’s
Paulo Roberto