Primeiras aulas do curso Certificação C# Programming parte 6: Coleções, XML e JSON

Certificação C# Programming parte 6: Coleções, XML e JSON

Serialização com XML - Introdução

Eu sou Marcelo Oliveira e vamos começar a parte 6 do nosso curso de Certificação da Prova 70-483: Programando em C# da Microsoft e vamos ver os tópicos que nós vamos abordar nessa parte 6 do curso.

Começando com a serialização de dados, vamos aprender a transformar informações de um objeto em um formato que pode ser texto, que pode ser um formato em memória que vai poder transportar esses dados para um outro local que pode ser um arquivo, pode ser um outro objeto e também pode ser, por exemplo, um banco de dados.

Vamos começar vendo o tipo de serialização com o formato XML que é bastante utilizado, então vamos aprender a transformar os dados de um objeto em um documento XML, vamos continuar vendo o formato JSON que é muito utilizado ultimamente na internet, que também é parecido com XML, mas que é mais simplificado.

Também vamos ver a formatação binária, vamos gerar informações binárias a partir de um objeto, fazendo uma cópia como se fosse tirar um retrato do estado de um objeto, também vamos aprender a fazer a serialização personalizada para você ter mais controle sobre esse processo e depois vamos aprender sobre o contrato de dados que define como exatamente vamos transportar os dados de um objeto para a serialização.

E depois nós vamos ver as coleções, vamos começar com o dicionário, que é uma coleção do tipo chave valor, onde procuramos o valor a partir de uma chave, como se fosse um dicionário. Depois nós vamos ver também as matrizes, ou também são chamadas de arrays, que são o tipo de coleção mais essencial da plataforma .NET, também vamos aprender sobre as listas que são um tipo de coleção bastante flexível e poderosa, que também são chamados de arrays dinâmicos.

Vamos aprender sobre o conjunto, que é um tipo de coleção não sequencial, ao contrário dos arrays e das listas. E vamos aprender também a trabalhar com filas onde o elemento que sai é exatamente o primeiro elemento a entrar nessa fila. Vamos aprender, ao longo dessa parte 6 do curso, a escolher um tipo certo de coleção para cada situação diferente.

Vamos aprender a inicializar uma coleção, criar, a partir de uma coleção vazia, começar a adicionar elementos nessa coleção e também vamos aprender a já criar uma coleção já populada com alguns itens. Vamos aprender também a adicionar e remover itens de uma coleção, vamos aprender a, por exemplo, limpar uma coleção, remover somente uma faixa de elementos e com isso vamos conseguir manipular uma coleção para ter mais controle sobre os dados.

Vamos aprender também a criar coleções personalizadas, onde temos o controle sobre, por exemplo, o processo de adicionar e remover itens dessa coleção. E vamos aprender também a trabalhar com a interface de coleções, vamos aprender a criar as coleções personalizadas utilizando essas interfaces e também vamos ver que a instrução foreach, que faz a interação entre os elementos, ela utiliza um tipo de interface que é o IEnumerable.

Então é isso, espero que vocês gostem dessa parte 6 do curso.

Serialização com XML - Serializando Objetos

Nesse vídeo vamos aprender sobre a serialização com XML. Nós temos, dentro da pasta item 01 serialização, uma subpasta 01.01xml e logo abaixo nós temos o projeto que é o 01.01, lá dentro nós vamos encontrar o código inicial para e esse vídeo.

Então nós temos um problema inicial, vamos abrir o programa dentro do arquivo Progam.cs e qual é o problema inicial desse vídeo? Nós temos um diagrama que mostra que temos um sistema, o sistema 1, que contém esse objeto A, esse objeto que está dentro do sistema 1 precisa ser transmitido para fora do sistema 1, para um sistema externo, o sistema 2 e lá dentro do sistema 2 esses dados precisam ser convertidos em um outro objeto, de uma outra classe.

Então o que precisamos fazer aqui? Vamos ter que transformar o objeto de uma classe em um objeto de uma outra classe, passando através de um meio. Esse meio chamamos de serialização, que é um processo de transferir dados de um objeto e a partir daí você pode imprimir, salvar em arquivos, salvar em banco de dados, fazer várias coisas com essa informação que foi serializada a partir de um objeto.

Então temos, no modelo do nosso projeto, a classe LojaDeFilmes, então no nosso sistema inicial ele possui uma classe LojaDeFilmes que contém informações de uma LojaDeFilmes virtual, como por exemplo, Filmes que é uma propriedade lista da LojaDeFilmes. E também os Diretores desses filmes que é uma propriedade lista da LojaDeFilmes. E no nosso modelo nós também temos a classe Diretor e a classe de Filme.

Então, esse modelo existe para o nosso sistema inicial e no final das contas, vamos pegar informações dessa LojaDeFilmes e transferir as mesmas informações para uma outra classe chamada MovieStore, então MovieStore que em inglês significa LojaDeFilmes, o MovieStore também é um outro modelo de um sistema externo.

Então dentro da MovieStore nós temos a lista de diretores que é o Directors, e aqui a lista de filmes que é a propriedade Movies. Então voltando para o nosso programa, vamos começar a trabalhar em cima desse problema, então nós temos o sistema 1 que precisa passar adiante as informações do objeto LojaDeFilmes e vamos receber do outro lado do sistema 2 essas informações, convertendo para a classe MovieStore.

E como vamos fazer isso? Vamos utilizar a técnica chamada de serialização, a serialização pode ser feita através de alguns formatos, entre eles, o formato XML que é bastante conhecido, vamos colocar aqui um outro diagrama onde nós temos um documento XML que é utilizado para armazenar tanto a estrutura de dados do objeto, como também os seus dados.

Então vamos começar, dentro do método Main, a colocar o código do primeiro sistema, o sistema que vai emitir o código, que vai passar para frente os dados do objeto LojaDeFilmes.

Então, para nos ajudar, já existe dentro da classe do Program.cs um método para obter os dados, que é o método ObterDados que retorna um objeto da classe LojaDeFilmes, que já está populada com uma série de informações, nós temos inicialmente os diretores e depois a lista de filmes da loja.

Então dentro do método Main vamos obter os dados chamando o método “ObterDados();” e vamos armazenar esses dados dentro de uma variável, vamos declarar então “var Dados = ObterDados();”. Agora, para eu obter um documento XML a partir dos dados do objeto LojaDeFilmes, eu preciso ter uma classe do .NET que é especializada em serializar dados, a classe serializadora de XML, em inglês, XmlSerializer.

Então vamos colocar “New XmlSerializer();” e eu preciso resolver o namespace dessa classe, então vamos teclar “Ctrl + .”, clicar em using System.Xml.Serialization, ele já resolveu e aqui eu vou armazenar essa instância dentro de uma variável ,então “var XmlSerializer = new XmlSerializer();”.

Agora, vamos ter que passar dentro do construtor dessa classe qual é o tipo com qual eu vou estar trabalhando, nesse caso, o nosso objeto inicial, que foi retornado pelo método ObterDados, é o objeto da classe LojaDeFilmes, então eu tenho que passar, dentro do construtor dessa classe, o tipo da LojaDeFilmes, ou chamar o operador “typeof”, que é uma instrução do C# que me retorna o tipo de uma classe. Então vamos passar “LojaDeFilmes”.

Agora que eu tenho o serializador, eu vou começar a gerar um documento XML a partir desse serializador que trabalha com a minha classe LojaDeFilmes, eu vou pegar o nome da variável “xmlSerializer”, e vou acessar o método serializador, que é o “Serialize”, que vai também receber um parâmetro que vai ser o parâmetro que vai indicar para onde nós vamos gerar esse documento XML. Vai ser para arquivo? Vai ser para um stream, ou seja, um fluxo.

Então, o que eu gostaria agora é imprimir no console, eu quero imprimir simplesmente, sem gravar em lugar nenhum, para podermos visualizar, para isso eu posso utilizar um objeto stream, ou inglês, que é um fluxo, esse fluxo pode ser, por exemplo, um fluxo de arquivo.

Mas o método Serialize também permite que eu passe um parâmetro do tipo TextWriter, então já vimos isso anteriormente que você pode construir um TextWriter utilizando a classe StringWriter, então o que eu posso fazer aqui? Eu posso declarar uma classe StringWriter, “new StringWriter();”, vamos resolver o namespace teclando “Ctrl + .” clicando aqui em using system.io, já resolvi e o StringWriter implementa a classe IDisposable, então eu posso colocar ele dentro de um bloco using.

Então “using” vamos colocar a declaração do StringWriter, vamos chamar de “var stringWriter = new StringWriter()”. Com esse StringWriter, vamos poder escrever o resultado da serialização dentro desse escritor de strings, vamos colocar o bloco do using e aqui dentro eu vou realizar a serialização para esse objeto StringWriter.

Então vamos recortar esse trecho e colar dentro do bloco using, e agora sim eu passo para dentro do método Serialize o parâmetro “stringWriter”, então o que está faltando aqui? O método Serialize exige mais um parâmetro, porque não basta só serializar para o StringWriter, eu também tenho que passar qual é o objeto que contém os dados que eu quero jogar no documento XML.

Qual o meu objeto que contém os dados? É a minha variável dados, vamos colocar aqui então, o objeto “dados” que é a nossa LojaDeFilmes, então note que estamos pegando a variável dados, armazenando ela com a LojaDeFilmes e estamos passando no final para o serializador. E depois que eu serializei para o nosso StringWriter, agora sim eu posso pegar esse string e imprimir no console.

Então vamos colocar, dentro do using, “Console.WriteLine();” e agora sim imprimindo o “stringWriter” no console, vamos rodar a aplicação com o F5 e está no nosso console o documento XML contendo não somente a estrutura do nosso objeto LojaDeFilmes, mas também os dados desse objeto.

Serialização com XML - Serializando com Arquivo XML

Nós temos agora outras maneiras de fazer uma serialização com XML, vamos fechar o console e voltar para o nosso código, vamos exibir um novo diagrama e esse diagrama vai mostrar para nós o que podemos fazer com a serialização, nós temos o sistema inicial, que nosso caso tem a classe LojaDeFilmes, temos o objeto inicial que passa por um processo de serialização onde nós temos um stream, ou fluxo de dados, em inglês.

E nós já vimos como pegar os dados desse objeto LojaDeFilmes e passar para uma estrutura de um documento XML em memória, ou seja, utilizando um objeto que contém o texto, que é o StringWriter, utilizando a memória para armazenar esse documento XML, existem outras formas também, como por exemplo, banco de dados que pode receber esse documento XML, armazenar e ficar armazenado para você utilizar posteriormente.

Ou então você pode utilizar o sistema de arquivos para gravar o seu documento XML serializado. E é o que vamos ver agora, vamos trabalhar com arquivo XML. Então voltando para o nosso código, nós paramos logo após o código que imprimimos no console o resultado do StringWriter, então o que vamos fazer é utilizar o mesmo serializador de XML, que é essa variável xmlSerialize, e vamos serializar novamente, só que dessa vez para um arquivo texto.

Então vamos copiar o nome do nosso serializador XML, vamos colar aqui em baixo e chamar novamente o método “Serialize()”, só que dessa vez eu quero gravar o documento em arquivo, para isso, o método Serialize possuí uma sobrecarga, ou um overload, que ao invés de eu receber como eu estava fazendo, passando um StringWriter, eu posso passar um stream e um stream pode ser, por exemplo, um fluxo de dados para arquivo.

Eu quero que, do meu serializador, os dados vão direto para um arquivo para serem gravados lá, então para isso eu preciso ter primeiro um stream de arquivo, ou em inglês, um FileStream, então vamos declarar aqui em cima um “new FileStream”. Se você não tiver a referência, “Ctrl + .” e você vai adicionar a referência para essa classe. Então vamos colocar o construtor dessa classe FileStream que vai receber o nome do arquivo, que vai ser o arquivo que vai ser gravado.

Vamos colocar, por exemplo, “Loja.xml” que é uma extensão própria para documentos XML, e depois disso eu vou armazenar o novo stream em uma variável que eu vou chamar de “fileStream”, mas o Visual Studio está reclamando porque eu não estou passando todos os argumentos necessários para o construtor dessa classe.

Porque quando eu crio o novo FileStream eu preciso também passar qual é o tipo de acesso, então por exemplo, o tipo de acesso deveria ser “FileAccess.” eu tenho aqui 3 opções, leitura, leitura escrita ou escrita, nós estamos escrevendo no arquivo novo, então eu preciso escolher a opção ReadWrite ou Write, vamos colocar Write, em seguida eu vou colocar também o modo com o qual estou abrindo esse arquivo.

Então vamos colocar aqui o “FileMode.” e eu tenho várias opções, como o modo Append para adicionar novas linhas em um arquivo que já existe, o Create, CreateNew, que são para criar o arquivo, o abrir, Abrir, Abrir Ou Criar e o Truncate, eu vou utilizar o Create porque ele é o ideal, ele cria se o arquivo não existe e se ele já existe, ele vai simplesmente sobrescrever esse arquivo.

Mas eu cometi um erro porque eu inverti a ordem desses 2 parâmetros, vamos passar o FileMode.Create para o meio. Agora sim está correto. O FileStream é uma classe que implementa a interface IDisposable, por isso, convém colocarmos essa variável fileStream dentro de um bloco using que vai fazer o Disposable para nós, ele vai liberar os recursos utilizados na abertura e na gravação desse arquivo FileStream.

Então, “using” e dentro dos parênteses temos a declaração e a atribuição dessa variável FileStream, vamos fechar os parênteses e vamos colocar o bloco using, esse bloco vai definir o contexto para a variável fileStream, vamos recortar essa linha e mover para dentro desse bloco.

E agora eu tenho o xmlSerializer.Serialize() que vai serializar o nosso objeto LojaDeFilmes para o novo arquivo Loja.xml, então vamos passar o nome do “fileStream” e novamente eu preciso do objeto que está sendo serializado, que objeto é esse? É o nosso bom e velho objeto dados, nós temos a declaração dele aqui em cima, var dados = ObterDados(); e nós vamos pegar essa mesma variável e passar para baixo na serialização.

Então vamos serializar a variável objeto que está na variável “dados”, e agora nós temos a serialização para o arquivo, vamos então rodar com o F5, e rodando nós temos no console o que já tínhamos impresso com a serialização para o StringWriter, mas o que eu quero testar é se ele gravou o arquivo, então vamos fechar o console e vamos investigar onde é que ele gravou esse arquivo. Note que o arquivo não possui um caminho, ele só possuí o nome Loja.xml.

Quando você grava um arquivo sem mencionar qual é o caminho, o que um programa .NET vai fazer? Um programa console application vai gravar na pasta que contém os executáveis desse programa, vamos abrir dentro do projeto da nossa solução, vamos clicar nessa opção aqui em cima, Mostrar Todos os Arquivos, isso vai expandir para nós algumas pastas que não estão visíveis, como por exemplo, a pasta bin, que contém os executáveis desse programa.

E abrindo a pasta bin, eu tenho uma outra pasta Debug, então Debug porque estamos em modo de Debug da aplicação, como podemos ver aqui em cima no Visual Studio, estamos em modo de Debug, então Debug vai fazer com que o arquivo seja gravado dentro da pasta Debug, e abrindo essa pasta nós temos ainda uma subpasta netcoreapp2.0 e lá dentro nós vamos encontrar um arquivo novo chamado Loja.xml, é o documento XML gravado em um arquivo texto.

E o Visual Studio está exibindo a formatação correta de um arquivo XML, vamos colapsar esse arquivo XML clicando nesse primeiro nó que é o LojaDeFilmes, que é o nó raiz, que também é chamado de root em inglês, que é raiz em inglês. Então percebemos que a raiz desse documento XML é a classe LojaDeFilmes e ela possui uma lista de diretores e uma outra lista de filmes.

Vamos então clicar nesse segundo nó para colapsar. Fechamos a lista de diretores e aqui eu tenho a lista de filmes, vamos clicar para colapsar também, então com isso nós temos a estrutura do nosso objeto LojaDeFIlmes sendo transferida para um arquivo XML, não só a estrutura do objeto LojaDeFilmes mas também os dados, temos Diretor dentro do elemento Diretores, o Diretor tem o número de filmes e o nome do primeiro diretor que é o James Cameron.

Então vimos como serializar um arquivo XML. O que vamos fazer agora é pegar e abrir esse arquivo XML na outra ponta, o que seria o nosso segundo sistema, é o que vai consumir esse arquivo XML e vai fazer o processo inverso de serialização para objeto, a partir de arquivo XML para objeto.

Sobre o curso Certificação C# Programming parte 6: Coleções, XML e JSON

O curso Certificação C# Programming parte 6: Coleções, XML e JSON possui 380 minutos de vídeos, em um total de 75 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda .NET acessando integralmente esse e outros cursos, comece hoje!

  • 1245 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1245 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1245 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1245 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso por 1 ano

Estude 24h/dia onde e quando quiser

Novos cursos todas as semanas