Jump to content
sh4rk23

java.lang.ClassCastException e Serialização

Recommended Posts

sh4rk23

Olá.

Estou aqui com um problema que me está a moer um pouco o juízo.

A situação é a seguinte, estou a tentar ler um conjunto de dados serializados gravados para um ficheiro  por mim. O meu real problema é que quando tento executar as classes desenvolvidas para ler o ficheiro me dá o seguinte erro:

Exception in thread "main" java.lang.ClassCastException: MetadataSerializable cannot be cast to metadataSerializable.MetadataSerializable
at metadataSerializable.ReadMetadataFile.readRecords(ReadMetadataFile.java:55)
at metadataSerializable.ReadMetadataFile.main(ReadMetadataFile.java:109)
Java Result: 1

Estou a programar no Netbeans e as classes encontram-se no dentro de um package.  O que também acontece é que se colocar as classes na pasta de raiz do projecto do netbeans (src) o código executa perfeitamente, mas eu precisava delas dentro de um package para serem usadas.

Ora então porque é que dentro do package a classe MetadataSerializable não está a ser reconhecida?  😡

Posto de seguida o código para que possam analisar:

Estrutura da classe a gravar no ficheiro:

package metadataSerializable;



import java.io.Serializable;
import java.util.ArrayList;


public class MetadataSerializable implements Serializable{
    
    private String metadata[][];
    private ArrayList<String> itemsIds;
    
    public MetadataSerializable(){
        this(null,null);
        System.out.println("Metadata is empty!!!");
    }
    
    public MetadataSerializable(ArrayList<String> itemsIdList, String metadata[][]){
        setItemsIds(itemsIdList);
        setMetadata(metadata);
    }

    public ArrayList<String> getItemsIds() {
        return itemsIds;
    }

    private void setItemsIds(ArrayList<String> itemsIds) {
        this.itemsIds = itemsIds;
    }

    public String[][] getMetadata() {
        return metadata;
    }

    private void setMetadata(String[][] metadata) {
        this.metadata = metadata;
    }
    
    
}

Classe que tenta ler o conteúdo do ficheiro:

package metadataSerializable;


// Reading a file of objects sequentially with ObjectInputStream
// and displaying each record.

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ReadMetadataFile {
    
    private ObjectInputStream input;
    private MetadataSerializable metadata;

    public MetadataSerializable getRecordMetadata() {
        return metadata;
    }

    private void setMetadata(MetadataSerializable metadata) {
        this.metadata = metadata;
    }

    
    
   // enable user to select file to open
   public void openFile(String fileDirectory, String fileName)
   {
      try // open file
      {
         input = new ObjectInputStream(
            new FileInputStream(fileDirectory + "/" + fileName + ".metadata") );
      } // end try
      catch ( IOException ioException )
      {
         System.err.println( "Error opening file." );
      } // end catch
   } // end method openFile

   // read record from file
   public void readRecords()
   {
      MetadataSerializable record;

      try // input the values from the file
      { 
         int count = 0;
         
          
         while ( true )
         {
             count++;
             record = (MetadataSerializable) input.readObject(); //<-------------------------------------------- ERRO DE CAST
            
             if(count > 1)
                 System.out.println("Mais de um objecto presente no ficheiro");
             setMetadata(record);
         
         } // end while
      } // end try
      catch ( EOFException endOfFileException )
      {
          
          return; // end of file was reached
      } // end catch
      catch ( ClassNotFoundException classNotFoundException )
      {        
         System.err.println( "Unable to create object." );
         classNotFoundException.printStackTrace(); 
      } // end catch
      catch ( IOException ioException )
      { 
         System.err.println( "Error during reading from file." );
         ioException.printStackTrace();
      } // end catch
   } // end method readRecords

   // close file and terminate application
   public void closeFile()
   {
      try // close file and exit
      {
         if ( input != null )
            input.close();
         
      } // end try
      catch ( IOException ioException )
      {
         System.err.println( "Error closing file." );
         System.exit( 1 );
      } // end catch
   } // end method closeFile
    
    public static void main(String args[]){

       ReadMetadataFile readMetadataFile = new ReadMetadataFile();
       
       //File information
        //Movielens data
        final String directoryFileMovielens = "/home/ms/Documents...";
        final String nameFileMovielens = "Movielens";

       
       readMetadataFile.openFile(directoryFileMovielens, nameFileMovielens);
       readMetadataFile.readRecords();
       readMetadataFile.closeFile();
       
   }
   
}

Se alguém me puder dar umas dicas agradeço  :D

Share this post


Link to post
Share on other sites
Knitter

Porque são classes diferentes.

Uma classe é identificada pelo seu nome completo o que inclui o package. Logo uma classe chamada MetadataSerializable e uma metadataSerializable.MetadataSerializable são, efectivamente, classes diferentes mesmo que sejam compatíveis a nível de bytecode. Pelo que descreveste parece que estás a tentar ler dados serializados antes de teres feito modificações na classe.

Share this post


Link to post
Share on other sites
sh4rk23

Porque são classes diferentes.

Uma classe é identificada pelo seu nome completo o que inclui o package. Logo uma classe chamada MetadataSerializable e uma metadataSerializable.MetadataSerializable são, efectivamente, classes diferentes mesmo que sejam compatíveis a nível de bytecode. Pelo que descreveste parece que estás a tentar ler dados serializados antes de teres feito modificações na classe.

Percebi a parte de serem interpretadas como classes diferentes, mas não percebi muito bem o que querias dizer com fazer modificações na classe, podias explicar melhor.

Como posso resolver o problema?

Obg

Share this post


Link to post
Share on other sites
Knitter

Pelo erro que indicaste dá-me ideia que estás a tentar deserializar um ficheiro que foi criado antes de fazeres alterações à classe, isto é, dá-me ideia que testaste a parte da serialização criando o ficheiro, que depois alteraste a classe (por exemplo movendo-a de package) e que agora estás a tentar deserializar o ficheiro antigo com a classe nova.

Uma regra básica da serialização padrão (que é o que estás a usar) é que qualquer alteração feita numa classe torna todos os ficheiros criados inválidos, há algumas excepções mas geralmente uma modificação invalida ficheiros previamente gravados.

Share this post


Link to post
Share on other sites
sh4rk23

Hmmm. Penso que percebi, para (des)serializar tenho de usar a classe MetadataSerializable que usei para serializar e com o mesmo directório. Vou incluir o jar no projecto e penso que irá então funcionar.

Era esse então o meu erro. É a primeira vez que uso serialização, e também acho que nunca me tinham explicado isso.

Obrigadissimo pela ajuda.  :D

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.