Baixe o app para aproveitar ainda mais
Prévia do material em texto
Persistência de objetos em arquivo texto usando Java ➢ Objeto em arquivo: ● Um arquivo para cada objeto e um objeto para cada arquivo ● O arquivo contém o estado do objeto ● Cada arquivo deve ter um nome único ● O estado de um objeto é composto de todos os seus atributos e ligações com outros objetos ➢ Interface do cliente: ● O cliente que "cria" um objeto primeiramente cria-o em memória, define seu estado e em seguida torna-o persistente, invocando um método para esse fim (por exemplo, save) ● O cliente que "reinstancia" o objeto primeiramente cria-o em memória com estado indefinido e em seguida restaura seu estado persistente, invocando um método para esse fim (por exemplo, restore) ➢ Encapsulamento: ● Cada atributo e ligação de um objeto somente deve ser escrito e lido do arquivo pela correspondente classe ● Cada classe deve implementar um método para ler (por exemplo, restore_state) e outro para escrever (por exemplo, save_state) todos os atributos e associações que define ➢ Mecanismo baseado em herança: ● Toda classe de objetos persistentes deve ser derivada de uma classe que implementa a interface do cliente (por exemplo, PO, com os métodos save e restore) ● O método save da classe PO invoca o método save_state (definido em PO e sobrecarregado em cada classe da hierarquia) ● O método restore da classe PO invoca o método restore_state (definido em PO e sobrecarregado em cada classe da hierarquia) ● O método save_state de uma classe persistente invoca o método save_state de sua superclasse e escreve o seu estado no arquivo ● O método restore_state de uma classe persistente invoca o método restore_state de sua superclasse e lê o seu estado do arquivo ➢ Persistência de atributos em arquivo texto: ● Cada atributo do objeto é representado como uma substring no arquivo ● Se o atributo não for do tipo String, uma conversão de tipos é necessária (tanto na escrita como na leitura) ● Cada substring correspondente a um atributo é finalizada com um marcador (por exemplo, "**") ➢ Bibliotecas de Java: ● java.lang.* ● java.io.* ➢ Exemplo de escrita: try { FileOutputStream fos = new FileOutputStream("Joao.os"); FileDescriptor fd = fos.getFD(); FileWriter fw = new FileWriter (fd); fw.write("Joao da Silva"); fw.flush(); fw.close(); } catch (IOException e) { System.out.println(e); } ➢ Exemplo de leitura: try { FileInputStream fis = new FileInputStream("Joao.os"); FileDescriptor fd = fis.getFD( ); FileReader fr = new FileReader (fd); char[ ] buffer = new char[1024]; fr.read(buffer); String os = new String(buffer); System.out.println(os); fr.close( ); } catch (IOException e) { System.out.println(e); } Identificação Única de Objetos ➢ Propriedades: ● OID : Object Identity ● Designa um objeto de maneira única (não ambígua) no sistema ● Constante durante toda a vida do objeto ● Permite integridade de referência entre objetos ● Independe dos atributos do objeto (não é chave-primária) ● Gerada automaticamente pelo sistema quando um objeto é criado ● O instante de criação do objeto é o próprio instante de criação da OID ● Não é reutilizável ● Não contém informação sobre a localização corrente do objeto ● Pode indicar local e instante de criação ● É um nome que deve ser resolvido (por um servidor de nomes) para descobrir a localização do objeto (o serviço de persistência que armazena o objeto) ➢ Implementação: ● Numeração sequencial: class OID { private static long contador; private long id; OID( ) { contador ++; id = contador; } ... } ● Local e instante de criação class OID { private int hora; private int minuto; private int segundo; private int dia; private int mes; private int ano; String IP; public: OID( ) { ... } } ➢ Classe ObjectState: ● contém todo o estado de um objeto ● oferece operações básicas para empacotar/desempacotar atributos de tipos básicos (int, long, char, float, ...) ● objeto de outra classe deve oferecer operações para se empacotar/desempacotar em uma instância de ObjectState. Exemplo: classe Cor ● EX: ✓ Classe Veículo: marca : String ano : int cor : { azul, amarelo, verde} ✓ Classe Carro: numero de passageiros : int ✓ Classe Caminhao: capacidade de carga : float ✓ Classe Pessoa: nome : String sexo: boolean ✓ Associações: classe Pessoa e classe Veiculo: uma pessoa é proprietária de n veículos classe Pessoa e classe Carro: um carro transporta n pessoas Devem haver operações para ligar/desligar dois objetos ✓ Classes Veículo e Pessoa são subclasses de PO ✓ Cada classe define as operações save_state e restore_state ✓ Cada classe possui dois construtores: criação: gera OID e chama save_state reencarnação: usa OID fornecida como parâmetro para chamar restore_state ✓ O destrutor da classe deve chamar save_state
Compartilhar