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.
Problemas com writeObject[RESOLVIDO]
7 Respostas
mostre o código, fica mais fácil de entender como você está fazendo.
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);
}
public class Frequencia {
private char Chamada;
private Date Data;
public Frequencia(){
setChamada('V');
setData(null);
}
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);
}
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);
}
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;
}
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;
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
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.
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
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());
}
}
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;
}
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