serializaÇÃo de objetos programação orientada a objetos prof. christian danniel paz trillo senac...
Post on 17-Apr-2015
125 Views
Preview:
TRANSCRIPT
SERIALIZAÇÃO DE OBJETOSProgramação Orientada a ObjetosProf. Christian Danniel Paz Trillo
SENAC – BSI/BCC – 3ro Semestre
1
REPRESENTAÇÃO DE OBJETOS
Quando um programa é executado: Se reserva um espaço de memória para o
processamento do mesmo. Se reserva um espaço de memória para as
variáveis e objetos criados. Inicializa e atualiza os valores das variáveis e
objetos. Muitas vezes inseridos pelo usuário. Muitas vezes calculados. Obtidos de outras fontes.
Quando o programa finaliza: O espaço de memória reservado é eliminado. Os valores dos objetos são perdidos.
2
REPRESENTAÇÃO DE OBJETOS
Com isto, na segunda execução do programa o usuário terá que digitar de novo os valores que ele tinha inserido. Facebook – Exemplo:
Cadastramos usuários, amigos, etc. Alteramos os dados, e fechamos o programa. Ao executar de novo, os usuários que foram
cadastrados foram perdidos.
3
SERIALIZAÇÃO
Para lidar com esse problema, existe o processo de serialização.
A serialização é um processo de converter um objeto em um formato que pode ser armazenado e recuperado posteriormente. O objeto recuperado deve ser exatamente igual
ao objeto que foi armazenado. A descrição da classe (nomes dos atributos e
operações) não requer ser armazenada. Quando um objeto deve-se manter através
de diversas execuções do programa, diz-se que o objeto é “persistente”. 4
SERIALIZAÇÃO – EXEMPLO
Criei esta PPT. Abri o MS Power Point.
Criei uma nova apresentação em branco -> Objeto. Criei slides, inseri imagens -> tudo em memória, no
objeto. Chegou a hora do almoço, e agora? .... Botão Salvar! O objeto PPT é armazenado como um arquivo BSI
- POO – Aula 10.ppt. Depois do almoço abro o arquivo e volto
exatamente aonde estava.5
SERIALIZAÇÃO – EXEMPLO
O armazenamento de um arquivo .ppt é um exemplo muito bom de serialização: Auto-Save: serialização temporária. Formato:
ppt (Office 2000) ppt (Office 97) pptx (Office 2007)
Compatibilidade entre versões. E como o Open Office consegue salvar/abrir um
ppt? Pode ser visto como uma tentativa de “quebrar” o
formato do ppt (Open Source). Algumas coisas são interpretadas de forma diferente. 6
SERIALIZAÇÃO – USOS
Persistir objetos. Enviar objetos entre computadores: Web-
Services por exemplo. Detectar mudanças: mudanças entre o início
e o final da execução. Comunicação entre programas
independentemente de: Linguagem de programação. Sistema Operacional. Espaço Físico.
7
SERIALIZAÇÃO - STRING
Objeto -> String
Aluno a = new Aluno(“Julio”, {8, 5, 6, 9}); Serialização como String:
String serializado = a.serializa(); serializado = “Julio;[8,5,6,9];7”;
8
Aluno# String nome;# int [4] nota;- double media;
+ void leInformacao();+ double calculaMedia();+ void imprimeDados();
SERIALIZAÇÃO - STRING
Consigo recriar o objeto original? Se o programa que vai recriar conhece o
“formato” da tradução: SIM. a.desseralizar(“Julio;[8,5,6,9];7”); Aluno desserealizar(String serializado) {
String [] tokens = serializado.split(“;”); String nome = tokens[0]; String []notasS = tokens[1].split(“,”); int []notas = new int[4]; notas[0] = Integer.parseInt(notasS[0]); .... double media = Double.parseDouble(tokens[2]); Aluno a = new Aluno(nome, notas); return a;
}9
SERIALIZAÇÃO - STRING
Vantagens: Não depender de bibliotecas externas. A serialização e desserialização podem ser métodos
do próprio objeto. “Não” depende da linguagem de programação.
Desvantagens: Sempre precisarei escrever:
Serializador Desserializador.
Complexidade dos processos cresce com a complexidade do objeto: Objeto Eleição que tem uma lista de eleitores e de
candidatos. O formato é “fácil de ler” por humanos -> Segurança.
10
SERIALIZAÇÃO - BINÁRIO
Uma das principais desvantagens de serializar em Strings é que a informação fica altamente exposta. Ex:
O formato ppt seria mais fácil de quebrar. Uma imagem seria armazenada de forma muito
ineficiente.
Outra desvantagem é o espaço necessário, escrever diretamente em texto pode não aproveitar a possibilidade de armazenar um determinado tipo de objeto de melhor forma: “32000” (5 x 2 bytes) ocupa mais que 32000 (4
bytes).11
SERIALIZAÇÃO - BINÁRIO
Java oferece um mecanismo de serialização que permite armazenar os dados em um objeto complexo em um único fluxo de bytes.
Aluno a = new Aluno(“Julio”, {8, 5, 7, 9});
Serialização:
¬í sr poo.Aluno…›S³ëÍ D mediaL nomet Ljava/lang/String;[ notat [Ixp@ t Juliour [IMº`&vê²¥ xp
12
SERIALIZAÇÃO - BINÁRIO
É um formato mais difícil de entender e alterar.
Armazena mais informações: Nome da classe. Nomes de alguns atributos (media, nome, nota). Informações de verificação: São dados
redundantes que permitem verificar se os valores lidos são válidos.
Ex: O CPF utiliza esta idéia: os dois últimos dígitos do CPF
permitem validar se um CPF é válido. Não preciso implementar métodos de
serialização / desserialização, Java sabe o que armazenar e o que não armazenar.
13
SERIALIZAÇÃO – BINÁRIO
Para podermos serializar um objeto de uma classe X: Precisamos informar que X implementa a
interface Serializable. Declarar uma constante que indica a versão
(como no caso do ppt): serialVersionUID.
Utilizaremos duas classes para serializar: ObjectOutputStream e FileOutputStream.
Utilizaremos duas classes para desserializar: ObjectInputStream e FileInputStream.
14
SERIALIZAÇÃO – BINÁRIO
Exemplo de código:
public class Aluno implements Serializable{
private static final long serialVersionUID = -8819364088302023420L;
protected String nome;
protected int [] nota;
private double media;
}
15
SERIALIZAÇÃO – BINÁRIO
Exemplo de código:
Aluno a = new Aluno(“Julio", 8, 5, 6, 9);
try {
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("c:\\a.bin"));
o.writeObject(a);
} catch (IOException e) {
e.printStackTrace();
}
16
SERIALIZAÇÃO - BINÁRIO
ObjectOutputStream é responsável pela serialização: traduzir o objeto a um fluxo de bytes.
FileOutputStream é responsável por escrever o fluxo de bytes a um arquivo no sistema operacional. Se trocamos a linha 3 por:
ObjectOutputStream o = new ObjectOutputStream(System.out);
O fluxo será escrito diretamente na tela (System.out).
O método writeObject realiza o processo de serialização.
17
SERIALIZAÇÃO – BINÁRIO
Exemplo de código:
try {
ObjectInputStream i = new ObjectInputStream(new FileInputStream("c:\\a.bin"));
Aluno a2 = (Aluno) i.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
18
SERIALIZAÇÃO - BINÁRIO
ObjectInputStream é responsável pela desserialização: traduzir o fluxo de bytes a um objeto.
FileInputStream é responsável por ler o fluxo de bytes de um arquivo no sistema operacional.
O método readObject realiza o processo de desserialização.
A exceção ClassNotFoundException pode ser lançada pois podemos tentar recuperar um objeto de uma classe X criada por outro programa do qual não temos a definição. 19
SERIALIZAÇÃO - BINÁRIO
Vantagens: Não é preciso implementar nada. Menos fácil de alterar diretamente no
arquivo(dificulta fraudes). Desvantagens:
Depende da linguagem de programação. Se bem alguns tipos de dados são armazenados
eficientemente, não aproveita possibilidades de compactação para reduzir o tamanho do arquivo. O arquivo cresce linearmente com o número de
objetos armazenados. Mudanças na estrutura da classe (versões)
podem levar a incompatibilidade. 20
SERIALIZAÇÃO –FORMATOS PADRÃO
Uma das principais desvantagens de um formato próprio de uma linguagem é a possibilidade de trocar dados entre programas.
Para isso existem outros formatos padrão para serializar: XML, CSV, JSON. XML: Baseado na linguagem de marcação criada
para páginas Web (HTML). CSV (Comma Separated Values): Armazenamento
de dados simples no estilo banco de dados. Cada objeto é representado por uma linha e os atributos
separados por algum caractere (vírgula, ponto e vírgula, etc.
JSON (JavaScript Object Notation): Formato criado para troca de informações na Web. Pode ser diretamente avaliado pelo compilador JavaScript.
21
SERIALIZAÇÃO DE OBJETOS XML - XSTREAMProgramação Orientada a ObjetosProf. Christian Danniel Paz Trillo
SENAC – BSI / BCC – 3ro Semestre
22
XML
XML: Extensible Markup Language. É um dos formatos mais utilizados para
descrever objetos e tipos de dados. É uma linguagem Padrão W3C (WWW
Consortium).
23
XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<receita nome="pão" tempo_de_preparo="5 minutos" tempo_de_cozimento="1 hora">
<titulo>Pão simples</titulo>
<ingredientes><ingrediente quantidade="3" unidade="xícaras">Farinha</ingrediente><ingrediente quantidade="7" unidade="gramas">Fermento</ingrediente><ingrediente quantidade="1.5" unidade="xícaras"
estado="morna">Água</ingrediente><ingrediente quantidade="1" unidade="colheres de chá">Sal</ingrediente>
</ingredientes>
<instrucoes><passo>Misture todos os ingredientes, e dissolva bem.</passo><passo>Cubra com um pano e deixe por uma hora em um local morno.</passo> <passo>Misture novamente, coloque numa bandeja e asse num forno.</passo>
</instrucoes>
</receita>24
XML
XML permite descrever: Valores (String):
<titulo>Pão simples</titulo> Objetos:
<ingrediente quantidade="3" unidade="xícaras">Farinha</ingrediente>
Coleções (String ou de Objetos):<instrucoes>
<passo>Misture todos os ingredientes, e dissolva bem.</passo>
<passo>Cubra com um pano e deixe por uma hora em um local morno.</passo>
<passo>Misture novamente, coloque numa bandeja e asse num forno.</passo>
</instrucoes>25
XML - OBJETO
Com isso, é possível utilizar XML para serializar objetos.
26
<?xml version="1.0" encoding="ISO-8859-1"?>
<receita nome="pão" tempo_de_preparo="5 minutos" tempo_de_cozimento="1 hora">
<titulo>Pão simples</titulo>
<ingredientes><ingrediente quantidade="3"
unidade="xícaras">Farinha</ingrediente><ingrediente quantidade="7"
unidade="gramas">Fermento</ingrediente><ingrediente quantidade="1.5" unidade="xícaras"
estado="morna">Água</ingrediente><ingrediente quantidade="1" unidade="colheres de
chá">Sal</ingrediente>
</ingredientes>
<instrucoes><passo>Misture todos os ingredientes, e dissolva
bem.</passo><passo>Cubra com um pano e deixe por uma hora em
um local morno.</passo> <passo>Misture novamente, coloque numa bandeja e
asse num forno.</passo>
</instrucoes>
</receita>
ReceitaString nome;Strimg tempoPreparo;String tempoCozimento;String titulo;Collection<String> instrucoes;
Ingredienteint quantidade;String unidade;String nome;String estado;
0..*
XSTREAM
Xstream é uma biblioteca para serializar e desserealizar objetos a XML de forma simples.
https://nexus.codehaus.org/content/repositories/releases/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar
Características: Fácil de Usar. Não é necessário realizar mapeamentos de tipos de
objetos, a biblioteca já reconhece a maioria de tipos de dados: String, int, bool, ... Coleções, Mapas, Vetores, ...
O XML resultante é de fácil leitura para humanos. Serializa atributos públicos, privados e protegidos.
27
BIBLIOTECA - JAVA
Para associar uma biblioteca a nossa aplicação, é necessário referenciá-la desde o nosso projeto (no caso do Eclipse ou do NetBeans).
Para isso colocamos a biblioteca dentro da estrutura do nosso programa em uma pasta lib por exemplo. lib\xstream-1.3.1.jar.
Associamos a biblioteca no Build Path (Clic Direito no Projeto -> Build Path -> Configure -> Add Jar.
Com essa referência, poderemos utilizar as classes da biblioteca como se forem do nosso projeto.
28
XSTREAM
//Inicialização de Objetos Receita receita = new Receita(); receita.nome = “pão”; ... receita.ingredientes.add(new
Ingrediente(“Farinha”, 3, “xicaras”)); ... //Serialização a um String com formato XML XStream xstream = new XStream(new
DomDriver()); String xml = xstream.toXML(receita); Receita copia = (Receita)xstream.fromXML(xml);
29
XSTREAM
... String xml = xstream.toXML(receita); //Desserialização a um String com formato
XML Receita copia =
(Receita)xstream.fromXML(xml); //Imprime “pão” System.out.println(copia.nome);
30
XSTREAM – XML GERADO <Receita> <nome>pão</nome> <titulo>pão simples</titulo> <tempoCozimento>1 hora</tempoCozimento> <tempoPreparo>5 minutos</tempoPreparo> <ingredientes> <poo.Ingrediente> <nome>Farinha</nome> <quantidade>3</quantidade> <unidade>xicaras</unidade> </poo.Ingrediente> </ingredientes> <instrucoes/> </Receita>
31
XSTREAM - ARQUIVOS
Como para poder persistir a informação é necessário armazená-la em arquivos, mudaremos as chamadas ao fromXML e toXML para ler escrever em arquivos:
Leitura: Receita copia = (Receita)xstream.fromXML(new
FileInputStream("c:\\receita.xml")); Escrita:
xstream.toXML(receita, new FileOutputStream("c:\\receita.xml"));
Dica: Quando escrevemos em arquivos é necessário cuidar dos caracteres acentuados. 32
SERIALIZAÇÃO – RESUMO
A Serialização é um processo muito utilizado em sistemas complexos: Não tanto para armazenar informação de forma
permanente, pois os Bancos de Dados fazem isso de forma mais eficiente e flexível.
Para transmitir informação entre aplicações de diversas plataformas.
Para transmitir informação pela internet – Web Services.
Para popular páginas Web.
33
EXERCÍCIO DE PROGRAMAÇÃO FINALProgramação Orientada a ObjetosProf. Christian Danniel Paz Trillo
SENAC – BSI / BCC – 3ro Semestre
34
EXERCÍCIO DE PROGRAMAÇÃO
Criar um programa orientado a objetos que implemente operações de Matrizes (como vetores bi-dimensionais ou como matrizes esparsa).
35
EXERCÍCIO DE PROGRAMAÇÃO
Aplicação: Manipulação de Imagens
36
X matrizEspelho
Transposta
EXERCÍCIO DE PROGRAMAÇÃO
Data de Entrega: 11 de Junho. Grupos de 2 ou 3 pessoas. Requisitos:
Implementação de Interface de usuário: 2 pontos.
Criação da classe Matriz Comum: 2 pontos. Criação da classe Matriz Sparsa: 3 pontos. Implementação do método
calcularDeterminante: 1 ponto. Algum exemplo de manipulação de imagens: 2
pontos. Peso na Nota Final: 30% 37
top related