Persistência de objetos em arquivo texto usando Java Alcides Calsavara
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)
Mecanismo baseado em herança (continuação) 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 Alcides Calsavara
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)
Propriedades 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
Propriedades É 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 seqüencial class OID { private static long contador; private long id; OID( ) { contador ++; id = contador; } ... }
Implementação (cont.) 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
Exemplo classe Veiculo: classe Carro: classe Caminhao: marca : String ano : int cor : { azul, amarelo, verde} classe Carro: numero de passageiros : int classe Caminhao: capacidade de carga : float
Exemplo (cont.) classe Pessoa: associações: 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
Exemplo (cont.) classes Veiculo 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