Problemas com writeObject[RESOLVIDO]

7 respostas
brunolr

seguinte, estou com um problema com o writeObject
no meu caso to tentando gravar varios objetos alunos que dentro deles
tem um vector de varias frenquencias
então as joguei em um arraylist temporario
mas não consigo grava-los no arquivo
nem com um vetor comum consegui
alguem sabe como posso fazer isso?
tento usar algum outro tipo de write?
agradeço a todos que ajudarem.

7 Respostas

converge

mostre o código, fica mais fácil de entender como você está fazendo.

brunolr
opa desculpa a demora em responder eu tava sem internet mostrar o código todo vai ser um problema vou tentar mostrar um básico para vocês entenderem o que quero fazer classe aluno
public class Aluno {
	private String Nome;
	private int Matricula;
	private int Notas[]=new int[3];
	private boolean Deletado;
	private Vector<Frequencia> Frequencia;
	private int ControleDeNota;
	
	
	public Aluno(){
		setControleDeNota(0);
		setNome(null);
		setMatricula(0);
		for(int i=0;i<3;i++){
			setNotas(-1,i);
		}
		Frequencia=new Vector<Frequencia>();
		setDeletado(false);
	}
classe frequencia
public class Frequencia {
	private char Chamada;
	private Date Data;
	public Frequencia(){
		setChamada('V');
		setData(null);
	}
classe turma
public class Turma {
	private Vector<Aluno> Alunos;
	private String NomeDaTurma;
	private int Dia;
	private int NumDeAlunos;
	
	
	public Turma(){
		Alunos=new Vector<Aluno>();
		setNomeDaTurma(null);
		setDia(0);
		setNumDeAlunos(0);
	}
classe Escola
public class Escola {
	private Vector<Aluno> alunos;
	private Turma turma;
	private Vector<Integer> recuperarMatricula;
	private int matricula;
	public Escola(){
		alunos=new Vector<Aluno>();
		setTurma(new Turma());
		recuperarMatricula=new Vector<Integer>();
		setMatricula(0);
	}
e por ultimo como estou tentando gravar no arquivo binario, já aviso que essa parte do meu código ta uma confusão
public class ArquivoBinario implements Serializable{
   private String Path;
   private Escola escola;
   private FileOutputStream   FileGravar;
   private ObjectOutputStream SaidaGravar;
   private FileInputStream    FileLer;
   private ObjectInputStream  SaidaLer;
   private File Arquivo;
   public ArquivoBinario(){
       setPath(null);
       setEscola(null);
       setFileGravar(null);
       setSaidaGravar(null);
       setFileLer(null);
       setSaidaLer(null);
       setArquivo(null);
   }
   
   public ArquivoBinario(String Path){
       setPath(Path);
       setEscola(null);
       setFileGravar(null);
       setSaidaGravar(null);
       setFileLer(null);
       setSaidaLer(null);
       setArquivo(null);
   }
//atributos e construtores
//função gravar
   public void AbrirArquivo(){//Abre o Arquivo para leitura e gravação
       try{
         setArquivo(new java.io.File(getPath()));  
         setFileGravar(new FileOutputStream(getArquivo()));
         setSaidaGravar(new ObjectOutputStream(getFileGravar()));
         setFileLer(new FileInputStream(getArquivo()));
         setSaidaLer(new ObjectInputStream(getFileLer()));
       }catch(Exception ex){
         JOptionPane.showMessageDialog(null,"Erro de Abertura do Arquivo",
                                            "Abrir Arquivo",
                                            JOptionPane.ERROR_MESSAGE);  
         System.out.println(ex.getMessage());
       }
   }
   

   public boolean Gravar(){//Grava os escola no Arquivo
	    int tamanho=getEscola().getAlunos().size()+getEscola().getTurma().getAlunos().size()+getEscola().getRecuperarMatricula().size();
	    Aluno alunos[]=new Aluno[tamanho];
	    ArrayList<Aluno> Alunos=new ArrayList<Aluno>();
	    ArrayList<Frequencia> Frenq=new ArrayList<Frequencia>();
        int cont=0;
        for(int i=0;i<getEscola().getTurma().getAlunos().size();i++){
        	Aluno a=new Aluno();
        	a.setMatricula(getEscola().getTurma().getAlunos().elementAt(i).getMatricula());
        	a.setFrequencia(null);
        	alunos[cont]=a;
        	Alunos.add(a);
        	for(int j=0;j<=getEscola().getAlunos().elementAt(i).getFrequencia().size();j++){
            	Frenq.add(getEscola().getTurma().getAlunos().elementAt(i).getFrequencia().elementAt(j));
            }
        	cont++;
        }
        for(int i=0;i<getEscola().getAlunos().size();i++){
        	alunos[cont]=getEscola().getAlunos().elementAt(i);
        	getEscola().getAlunos().elementAt(i).setFrequencia(null);
        	Alunos.add(getEscola().getAlunos().elementAt(i));
        	cont++;
        }
        for(int i=0;i<getEscola().getRecuperarMatricula().size();i++){
        	Aluno a=new Aluno();
        	a.setMatricula(getEscola().getRecuperarMatricula().elementAt(i));
        	a.setNome("-1");
        	a.setFrequencia(null);
        	alunos[cont]=a;
        	Alunos.add(a);
        	cont++;
        }
        //System.out.println("a");
        try {
        	//System.out.println("b");
           	getSaidaGravar().writeObject(Alunos);
           	getSaidaGravar().flush();
       	} catch (IOException ex) {
        	return false;
       	}
        /*try {
           	getSaidaGravar().writeObject(Frenq);
           	getSaidaGravar().flush();
       	} catch (IOException ex) {
        	return false;
       	}*/
        return true;
   }
o atributo Escola Dados já foi previamente instanciado e as variaveis começando por letra maiuscula é padrão do meu professor mais tarde vou mudar todas as variaveis para o padrão certo, começando por letras minusculas agradeço a todos que ajudarem
T

Você precisa indicar que as classes a serem serializadas “implements Serializable”. Como “java.io.Serializable” é uma interface sem método nenhum, é bastante simples implementar Serializable.

Note: a classe que vai ser gravada é que deve implementar Serializable (no caso, Aluno). Não é a classe que grava (no seu caso, ArquivoBinario).

Se houver algum campo na sua classe que não deva ser serializado, marque-o com a palavra-chave “transient”. Exemplo:

private transient InputStream inputStream;
brunolr

tipo
minha classe escola tem todo o controle do meu sistema
se eu fizer o que tu disse com a classe escola posso gravar um objeto inteiro da classe escola?
tipo

Escola e=new Escola();
writeObject(e);

vlw pela ajuda cara
obrigadão mesmo

T

Para ser serializável:

  • Uma classe deve implementar Serializable;
  • Todos os atributos da classe que não são transient devem pertencer a classes que implementam Serializable.

Por exemplo, se Escola contém um List de Turma (nunca vi uma escola com só uma turma), então tanto Escola quanto Turma têm de implementar Serializable, e assim por diante.

brunolr

a só
entendi
mas o sistema que to fazendo é um trabalho
o professor não exigiu mais de uma turma
então só implementei uma =D
aparentemente consegui grava
a função writeObject não retornou erro algum
mas não consegui da read na escola

public boolean CarregarArquivo(){//Carrega os escola arquivo para uma lista boolean sucesso = false; if(getArquivo()!=null){ try { setEscola((Escola) getSaidaLer().readObject()); sucesso = true; } catch (IOException ex) { sucesso = false; } catch (ClassNotFoundException ex) { sucesso = false; } } return sucesso; }
vlw pela ajuda
abraço

brunolr
problema resolvido é que a parte de gravação e leitura de um arquivo binário foi baseado no prototipo do meu professor ele deixava entrada e saida abertas ou seja output e input sempre estavam abertos ai para resolver deixei apenas o File aberto e só abria o output na hora de gravar no arquivo e o input na hora de jogar na memória ai ficou assim
public ArquivoBinario(String Path){
       setPath(Path);
       setEscola(new Escola());
       setFileGravar(null);
       setSaidaGravar(null);
       setFileLer(null);
       setSaidaLer(null);
       setArquivo(null);
   }
   
     
   public void AbrirArquivo(){
       try{
         setArquivo(new java.io.File(getPath()));
       }catch(Exception ex){
         JOptionPane.showMessageDialog(null,"Erro de Abertura do Arquivo",
                                            "Abrir Arquivo",
                                            JOptionPane.ERROR_MESSAGE);  
         System.out.println(ex.getMessage());
       }
   }
depois para gravar no arquivo
try {
            setFileGravar(new FileOutputStream(getArquivo()));
            setSaidaGravar(new ObjectOutputStream(getFileGravar()));
            getSaidaGravar().writeObject(Alunos);
        	getSaidaGravar().flush();
        	getFileGravar().close();
        	getSaidaGravar().close();
            setFileGravar(null);
            setSaidaGravar(null);
        	
       	} catch (IOException ex) {
        	return false;
       	}
e por ultimo tirar do arquivo e jogar na memória, ler
if(getArquivo()!=null){
    	   
            try {
            	
                setFileLer(new FileInputStream(getArquivo()));
                setSaidaLer(new ObjectInputStream(getFileLer()));
                Alunos = ((ArrayList<Aluno>) getSaidaLer().readObject());
                getFileLer().close();
                getSaidaLer().close();
                setFileLer(null);
                setSaidaLer(null);
                
            } catch (IOException ex) {
            	System.out.println("IOException");
                return false; 
                
            } catch (ClassNotFoundException ex) {
            	System.out.println("ClassNotFoundException");
               return false; 
               
            }

conclução:
ObjectOutputStream e o ObjectInputStream não podem estar abertos ao mesmo tempo
o porque eu não sei
se alguem poder esclarecer iria ajudar a mim e muitas outras pessoas que possam ter o mesmo problema
agradeço a todos que tentaram ajudar
graça a vocês meu trabalho já está encaminhado, só falta parte escriita e apresentação
abraço a todos

Criado 7 de novembro de 2008
Ultima resposta 17 de nov. de 2008
Respostas 7
Participantes 3