Serialização em arquivo

Boa Noite Pessoal!

Gostaria de saber como serializar num arquivo um objeto de uma classe A ,por exemplo essa classe A contém um atributo que é um array de objetos da classe B. O problema não é a sintaxe nem como serializar não o problem é que quando faço isso e leio do arquivo esse objeto só consigo acessar o elemento 0 do array de objetos da classe B quando vou acessar o elemento 1 e mando imprimir no JOptionPane.showMessaage só aparece o JOptionPane sem nada nele.

Espero que me ajudem!

Tanto a classe A quanto a classe B implementam a interface Serializable?

sim.

O array é estático (static) ou transient?
Se sim, ele não será serializado.
O array precisa ser uma variável de instância obrigatoriamente.

O Array está definido assim na Classe A:
public class Cliente extends Pessoa implements Serializable{
private int matricula,diasporSemana;
private Calendar datadeCadastro;
private int mesesPagos;
private Calendar ultimoPag;
private int diadepagamento;
private AvaFisica[] ava = new AvaFisica[20];
private static int ultimamatricula;

A classe A que falo é a classe Cliente
a Classe B é a classe AvaFisica
a classe b tambem implementa Serializable

Esqueci de falar tambem a superclasse pessoa tambem implementa Serializable

Andy, quando for postar código fonte, use a tag code.
Quanto ao seu problema, parece que o que está acontecendo é a forma que você está inicializando o array.
Tente inicializar o array (new AvaFisica[20]) dentro do construtor da classe Cliente.

Pergunta: você está mesmo inserindo elementos no array?

[]'s

Preciso ir dormir, to com bastante sono hehe. Amanhã dou uma olhada com mais calma. Não estou raciocinando muito bem agora hehe.

[]'s

Bom eu fiz um métoodo addAva(AvaFisica ava)
propositalmente adicionei 2 elementos nele deixando os outros vazio só pra efeito de teste. Quando vou puxar o objeto do arquivo e vou acessar esse atributo AvaFisica[] coloco o método getAva(int indice) e então coloco o método getIMC que é um atributo da classe AvaFisica mas antes de puchar do arquivo eu ja tenho gravado tudo nele nesse atrinuto eu guardo apenas dois elementos com valores o elemento 0 e 1 do atributo avaFisica mas só consigo acessar o zero. Vou tentar colocar no construtor como você me aconselhou.

não deu certo

Dê uma olhada nesse exemplo e tente encontrar o problema no seu código. Coloquei todas as classes no mesmo arquivo para simplificar.
O que eu falei sobre a inicialização do array foi besteira, estava com sono :smiley:

[code]import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
*

  • @author David Buzatto
    */
    public class Serializacao {

    private static final String FILE_NAME = “C:/dados.dat”;

    public static void main( String[] args ) {

     Serializacao s = new Serializacao();
     
     try {
         s.gravar();
         s.ler();
     } catch ( IOException exc ) {
         exc.printStackTrace();
     } catch ( ClassNotFoundException exc ) {
         exc.printStackTrace();
     }
    

    }

    public void gravar() throws IOException {

     Cliente c = new Cliente( "João", new Date() );
     
     AvaFisica av1 = new AvaFisica( "avaliação 1" );
     AvaFisica av2 = new AvaFisica( "avaliação 2" );
     AvaFisica av3 = new AvaFisica( "avaliação 3" );
     
     c.addAvaFisica( av1 );
     c.addAvaFisica( av2 );
     c.addAvaFisica( av3 );
         
     ObjectOutputStream os = new ObjectOutputStream( 
             new FileOutputStream( FILE_NAME ) );
    
     os.writeObject( c );
     os.close();
    

    }

    public void ler() throws IOException, ClassNotFoundException {

     ObjectInputStream oi = new ObjectInputStream( new FileInputStream( FILE_NAME ) );
     Object o = oi.readObject();
     
     if ( o instanceof Cliente ) {
         Cliente c = ( Cliente ) o;
         System.out.println( c );
     }
    

    }

}

class Pessoa implements Serializable {

private String nome;

public Pessoa( String nome ) {
    this.nome = nome;
}

public String getNome() {
    return nome;
}

}

class Cliente extends Pessoa implements Serializable {

private static SimpleDateFormat df = new SimpleDateFormat( "dd/MM/yyyy" );
private static final int MAX_AVA_FISICAS = 20;

private Date dataCadastro;
private AvaFisica[] avasFisicas;
private int ultimaAvaFisica;

public Cliente( String nome, Date dataCadastro ) {
    super( nome );
    this.dataCadastro = dataCadastro;
    this.avasFisicas = new AvaFisica[MAX_AVA_FISICAS];
}

public Date getDataCadastro() {
    return dataCadastro;
}

public void addAvaFisica( AvaFisica avaFisica ) {
    if ( ultimaAvaFisica <= MAX_AVA_FISICAS - 1 ) {
        avasFisicas[ultimaAvaFisica++] = avaFisica;
    }
}

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append( getNome() ).append( " - " ).append( df.format( dataCadastro ) );
    for ( AvaFisica av : avasFisicas ) {
        if ( av != null ) {
            sb.append( "\n" ). append( av );
        }
    }
    return sb.toString();
}

}

class AvaFisica implements Serializable {

private String descricao;

public AvaFisica( String descricao ) {
    this.descricao = descricao;
}

@Override
public String toString() {
    return descricao;
}

}[/code]

Obrigado! Vou tentar achar aqui até mais!

posta o código da classe cliente aí.

Obrigado por querer ajudar mas tiver que mudar pra persistencia em arquivo sequencial por causa da professora.
VLW mesmo

uma dica, se nao quiser serilaizar (acho que nao adianta nesse caso) mas é bem facil de fazer é colocar em xml

teu arrai ficaria tipo:

o Xstream faz tudo pra ti. é uma boa opção

Aproveitando que o colega deu a dica do XStream, eu indicaria outro framework para XML, o SimpleXML. Acho ele MUITO melhor que o XStream.

[]'s