Jump to content
DRS

[Resolvido] Streams de Objectos

Recommended Posts

DRS

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 by apocsantos

Share this post


Link to post
Share on other sites
HappyHippyHippo

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 by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
DRS

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] $

Share this post


Link to post
Share on other sites
HappyHippyHippo

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 by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
DRS

[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] $

Share this post


Link to post
Share on other sites
Baderous

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 by Baderous
  • Vote 1

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.