DRS Posted December 9, 2012 at 03:11 PM Report #486351 Posted December 9, 2012 at 03:11 PM (edited) Boas pessoal, no programa que estou a fazer ao compilar aparece as seguintes notas: Note: TstProduto2.java uses unchecked or unsafe operations.Note: Recompile with -Xlint:unchecked for details. e ao executar aparece: writing aborted; java.io.NotSerializableException: Produto Eu não percebo porque este erro já que eu implementei a interface Serializable... O programa que estou a fazer é por motivos didacticos retirado do livro "JAVA6" em que estou a tentar aprender "Streams de Objectos". O meu ficheiro "TstProduto1.java" consiste em criar um ficheiro (Stock.dat) e escrever objectos no mesmo, o ficheiro "TstProduto2.java" consiste em ler os objectos desse mesmo ficheiro e lê-los no programa, mas neste ultimo teste da o tal erro... "Produto.java" import java.util.*; import java.io.*; public class Produto implements Serializable{ private final long serialVersionUID = 1L; //ID de Serialização para instâncias desta classe //Variáveis de instância private String codigo; private String nome; private int quant; private Set<String> comps; //codigo dos componentes //Construtor completo public Produto (String cod, String nom, int qt, HashSet<String> cps){ codigo = cod; nome = nom; quant = qt; comps = new HashSet<String>(); for(String c : cps){ comps.add(c); } } //Métodos de instância public String daCod() { return codigo; } public String daNome() { return nome; } public int daQuant() { return quant; } public HashSet<String> daComps(){ HashSet<String> cps = new HashSet<String>(); for(String c : comps){ cps.add(c); } return cps; } public Produto clone(){ return new Produto(codigo, nome, quant, this.daComps()); } //Método toString() public String toString(){ StringBuilder s = new StringBuilder(); s.append("----------------------\n"); s.append("Codigo: "); s.append("\t"); s.append(codigo + "\n"); s.append("Nome: " ); s.append("\t"); s.append(nome + "\n"); s.append("\t"); s.append(quant + "\n"); int num = comps.size(); s.append("Componentes: "); s.append(num + "\n"); for(String c : comps){ s.append(c + "\n"); } return s.toString(); } //método alternativo a toString() public String asString(){ String s = "--------------------\n"; s = s + "Codigo: " + "\t" + codigo + "\n"; s = s + "Nome: " + "\t" + nome + "\n"; s = s + "Quant: " + "\t" + quant + "\n"; int num = comps.size(); s = s + "Componentes: " + num + "\n"; for(String c : comps){ s = s + c + "\n"; } return s.toString(); } } "TstProduto1.java" import java.io.*; import java.util.*; import static java.lang.System.out; import static java.lang.Math.random; //INTRODUÇÂO AS STREAMS DE OBJECTOS, "OBJECTOUTPUTSTREAM" e "OBJECTINPUTSTREAM"... //Classe de Teste public class TstProduto1{ private static final int MAXPRODS = 100000; //Método auxiliar para criação do HashMap public static HashMap<Integer, Produto> criaFichas(){ HashMap<Integer, Produto> stk = new HashMap<Integer, Produto>(); HashSet<String> comps = new HashSet<String>(); int c = 0; Produto p = null; for(int i = 1; i <= MAXPRODS; i++){ c = 0 + (int)(random()*5); //Numero de componentes de 0 .. c if(c>0){ for(int n = 1; n<= c; n++){ comps.add("CMP" + i%99 + n); } } p = new Produto("" + i, "PROD" + i%99, 1 + (int)(random()*1000), comps); stk.put(i, p.clone()); comps.clear(); } return stk; //Devolve HashMap com as 100.000 fichas... } public static void main(String[] args){ HashMap<Integer, Produto> stockNovo = new HashMap<Integer, Produto>(); HashSet<String> comps = new HashSet<String>(); stockNovo = criaFichas(); //Cria as MAXPRODS fichas GregorianCalendar call = new GregorianCalendar(); //Implementação do "ObjectOutputStream" e "FileOutputStream"... //Grava "Stock" num ObjectStream... try{ //Criando o ficheiro "Stock.dat" que guarda objectos e o "objecto stream" que aponta para o ficheiro... ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream("Stock.dat")); oout.writeObject(stockNovo); //Escreve Objectos no ficheiro... oout.flush(); oout.close(); }catch(IOException e){ out.println(e.getMessage()); } GregorianCalendar cal2 = new GregorianCalendar(); long difMils = cal2.getTimeInMillis()-call.getTimeInMillis(); out.println(stockNovo.size() + "fichas em " + difMils + "ms"); out.println("--------------------------------------"); } } "TstProduto2.java" (É aqui que ocorre o problema) import java.io.*; import java.util.*; import static java.lang.System.out; import static java.lang.Math.random; //INTRODUÇÂO AS STREAMS DE OBJECTOS, "OBJECTOUTPUTSTREAM" e "OBJECTINPUTSTREAM"... //Classe de Teste public class TstProduto2{ private static final int MAXPRODS = 100000; //Método auxiliar para criação do HashMap public static HashMap<Integer, Produto> criaFichas(){ HashMap<Integer, Produto> stk = new HashMap<Integer, Produto>(); HashSet<String> comps = new HashSet<String>(); int c = 0; Produto p = null; for(int i = 1; i <= MAXPRODS; i++){ c = 0 + (int)(random()*5); //Numero de componentes de 0 .. c if(c>0){ for(int n = 1; n<= c; n++){ comps.add("CMP" + i%99 + n); } } p = new Produto("" + i, "PROD" + i%99, 1 + (int)(random()*1000), comps); stk.put(i, p.clone()); comps.clear(); } return stk; //Devolve HashMap com as 100.000 fichas... } public static void main(String[] args){ HashMap<Integer, Produto> stockNovo = new HashMap<Integer, Produto>(); HashSet<String> comps = new HashSet<String>(); stockNovo = criaFichas(); //Cria as MAXPRODS fichas GregorianCalendar call = new GregorianCalendar(); //Implementação do "ObjectInputStream" e "FileInputStream"... //Lê de novo as MAXPRODS fichas contidas na "ObjectStream"... try{ ObjectInputStream oin = new ObjectInputStream(new FileInputStream("Stock.dat")); stockNovo = (HashMap<Integer,Produto>) oin.readObject(); //Escreve o stock lido no programa... /*for(Produto pr : stockNovo.values()){ out.println(pr); }*/ oin.close(); } catch(IOException e){ out.println(e.getMessage()); } catch(ClassNotFoundException e){ out.println(e.getMessage()); } GregorianCalendar cal2 = new GregorianCalendar(); long difMils = cal2.getTimeInMillis()-call.getTimeInMillis(); out.println(stockNovo.size() + "fichas em " + difMils + "ms"); out.println("--------------------------------------"); } } Agradeço quaisquer ajudas. Obrigado. PS: Desculpem lá o titulo, foi um engano... Edited December 9, 2012 at 03:30 PM by apocsantos
HappyHippyHippo Posted December 9, 2012 at 03:38 PM Report #486357 Posted December 9, 2012 at 03:38 PM (edited) HashMap<Integer, Produto> stockNovo = new HashMap<Integer, Produto>(); ... oout.writeObject(stockNovo); stockNovo é um HashMap, e essa classe não implementa o Serializable ps : por acaso implementa. diz em que linha a exceção é lançada Edited December 9, 2012 at 03:39 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
DRS Posted December 9, 2012 at 03:55 PM Author Report #486360 Posted December 9, 2012 at 03:55 PM O programa não indica a linha, uma coisa tenho a certeza, o erro so começou a dar depois de fazer o "try/catch" de "TstProduto 2". Notas e erros na consola: [sun Dec 09][15:44:40][Objects] $ javac TstProduto2.java Note: TstProduto2.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. [sun Dec 09][15:44:53][Objects] $ java TstProduto2 writing aborted; java.io.NotSerializableException: Produto 100000fichas em 19ms -------------------------------------- [sun Dec 09][15:45:00][Objects] $
HappyHippyHippo Posted December 9, 2012 at 04:11 PM Report #486364 Posted December 9, 2012 at 04:11 PM (edited) compila o ficheiro desta maneira e diz o que aparece javac -verbose TstProduto2.java (e já agora, NUNCA deixar uma compilação com qualquer tipo de mensagens) Edited December 9, 2012 at 04:11 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
DRS Posted December 9, 2012 at 04:15 PM Author Report #486368 Posted December 9, 2012 at 04:15 PM [sun Dec 09][15:45:00][Objects] $ javac -verbose TstProduto2.java [parsing started RegularFileObject[TstProduto2.java]] [parsing completed 18ms] [search path for source files: .] [search path for class files: /usr/lib/jvm/jdk1.7.0/jre/lib/resources.jar,/usr/lib/jvm/jdk1.7.0/jre/lib/rt.jar,/usr/lib/jvm/jdk1.7.0/jre/lib/sunrsasign.jar,/usr/lib/jvm/jdk1.7.0/jre/lib/jsse.jar,/usr/lib/jvm/jdk1.7.0/jre/lib/jce.jar,/usr/lib/jvm/jdk1.7.0/jre/lib/charsets.jar,/usr/lib/jvm/jdk1.7.0/jre/lib/jfr.jar,/usr/lib/jvm/jdk1.7.0/jre/classes,/usr/lib/jvm/jdk1.7.0/jre/lib/ext/sunjce_provider.jar,/usr/lib/jvm/jdk1.7.0/jre/lib/ext/sunpkcs11.jar,/usr/lib/jvm/jdk1.7.0/jre/lib/ext/localedata.jar,/usr/lib/jvm/jdk1.7.0/jre/lib/ext/sunec.jar,/usr/lib/jvm/jdk1.7.0/jre/lib/ext/zipfs.jar,/usr/lib/jvm/jdk1.7.0/jre/lib/ext/dnsns.jar,.] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/System.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Math.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/util/HashMap.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Integer.class)]] [loading RegularFileObject[./Produto.class]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]] [checking TstProduto2] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Number.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/util/Map.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/util/HashSet.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/util/Collection.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/util/AbstractSet.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/util/AbstractCollection.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/util/AbstractMap.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/util/GregorianCalendar.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/io/ObjectInputStream.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/io/FileInputStream.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/io/FileDescriptor.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/io/File.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/io/InputStream.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/io/IOException.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Exception.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Throwable.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/io/PrintStream.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/io/FilterOutputStream.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/io/OutputStream.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/ClassNotFoundException.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/ReflectiveOperationException.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/util/Calendar.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Error.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/io/FileNotFoundException.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/RuntimeException.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Byte.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Character.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Short.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Long.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Float.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Double.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Boolean.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Void.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/StringBuilder.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/CharSequence.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/io/Serializable.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Comparable.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/AbstractStringBuilder.class)]] [loading ZipFileIndexFileObject[/usr/lib/jvm/jdk1.7.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/StringBuffer.class)]] [wrote RegularFileObject[TstProduto2.class]] [total 268ms] Note: TstProduto2.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. [sun Dec 09][16:13:45][Objects] $
Baderous Posted December 10, 2012 at 01:46 AM Report #486415 Posted December 10, 2012 at 01:46 AM (edited) Testei o teu código e não obtive nenhum erro. Não terás tu alterado a classe Produto após teres gravado o ficheiro Stock.dat e agora estás a querer ler objectos com um formato diferente daquele esperado pelo mecanismo de desserialização e isso provoca o erro? Experimenta eliminar o ficheiro Stock.dat e correr outra vez a escrita + leitura desse ficheiro. O warning deve-se ao cast que fazes no readObject(), para resolver deves encapsular esse HashMap numa classe e depois fazer o cast para esse novo tipo. Edited December 10, 2012 at 01:47 AM by Baderous 1 Report
DRS Posted December 11, 2012 at 02:52 PM Author Report #486623 Posted December 11, 2012 at 02:52 PM Era mesmo isso 🙂 , muito obrigado aos dois.
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