sh4rk23 Posted April 13, 2012 at 03:45 PM Report #448992 Posted April 13, 2012 at 03:45 PM 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 😄
Knitter Posted April 13, 2012 at 03:51 PM Report #448995 Posted April 13, 2012 at 03:51 PM 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.
sh4rk23 Posted April 13, 2012 at 03:59 PM Author Report #448999 Posted April 13, 2012 at 03:59 PM 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
Knitter Posted April 13, 2012 at 04:09 PM Report #449005 Posted April 13, 2012 at 04:09 PM 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.
sh4rk23 Posted April 13, 2012 at 04:32 PM Author Report #449021 Posted April 13, 2012 at 04:32 PM 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. 😄
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now