Problemas com Serializable

7 respostas
hugown

Então galera, to com um probleminha na hora de fazer o serializable :B

Preciso de uma ajuda, da uns erro muito loco e nem tenho idéia, já fiz de tudo :\

Vou postar os códigos abaixo:

import java.io.*;

public class DvdCadastro {
	static BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));
	static ListarDVD listaDvd = new ListarDVD();
	static Dvd dvd;
	
	public static void runPrograma(){
		
		try{
			System.out.println("1 - Cadastrar DVD Filme\n2 - DVD Show/Música\nOpção: ");
			int opcCad = Integer.parseInt(buff.readLine());
			switch(opcCad){
				case 1:
					DvdCadastroFilme dvdFilme = new DvdCadastroFilme();
					dvdFilme.cadastrarFilme();
					listaDvd.catalogaDVDCadastrados(dvdFilme.retornaQntCad(),
													dvdFilme.retornaArrayDvdFilme());
					dvdFilme.lerArqSerializado();
				break;
				
				case 2:
					DvdCadastroMusical dvdMusical = new DvdCadastroMusical();
					dvdMusical.cadastrarMusical();
					listaDvd.catalogaDVDCadastrados(dvdMusical.retornaQntCad(),
												dvdMusical.retornaArrayDvdMus());
					dvdMusical.lerArqSerializado();
				break;
				
				default :
					System.out.print("\n\nOpção Inválida!");
				break;
			}
			
			
		}catch (Exception e) {
			// TODO: handle exception
			System.out.print("Erro na Entrada de Dados! "+e.getMessage()+"\n");
			
		}
	}
	
	
		
	
	
	public static void main(String[] args) {
		runPrograma();
	}
}
package eseei.emprestimo.listar;

import java.io.*;

public class DvdCadastroMusical{
	BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));
	Dvd[] dvd;
	int qntDVDCadastrado = 0;
	
	public void cadastrarMusical(){
		String title, autor, yesOrno;
		int ano;
		
		try{	
			//gerar arquivo para gravação
			FileOutputStream musicArq = new FileOutputStream("MUSICAL.dat");
			//gerar objeto para gravar objetos
			ObjectOutputStream gravarMusic = new ObjectOutputStream(musicArq);
			System.out.print("Deseja cadastrar algum DVD Musical/Show?");
			yesOrno = buff.readLine();
			if(yesOrno.equals("sim")){
			System.out.print("Entre com a quantidade de DVD's para cadastrar");
				int numDeDvd = Integer.parseInt(buff.readLine());
				dvd = new Dvd[numDeDvd];
				for(int i = 0; i < numDeDvd; i++){
					System.out.println("Entre com o Título do DVD, " +
										"seguido do autor e o ano : ");
						title = buff.readLine(); autor = buff.readLine(); 
						ano = Integer.parseInt(buff.readLine());
						dvd[i] = new Dvd(title, autor, ano);
					
						System.out.print("Quantas Faixas tem o DVD Musical/Show?");
						int qntFaixas = Integer.parseInt(buff.readLine());
						for(int j = 0; j < qntFaixas; j++){
							System.out.print("Entre com o nome da Faixa "+(j+1)+" : " );
							String nomeFaixas = buff.readLine();
							dvd[i].incluirFaixa(nomeFaixas);
					}
					++qntDVDCadastrado;
				}
			}else if(yesOrno.equals("não")){
				System.out.print("Nenhum DVD cadastrado!");
			}
			gravarMusic.flush();
			gravarMusic.close();
			musicArq.flush();
			musicArq.close();
		}catch (Exception e) {
			// TODO: handle exception
			System.out.print("Erro na entrada de Dados! "+e.getMessage());
			e.printStackTrace();
		}
	}
	
	public Dvd[] retornaArrayDvdMus(){
		return dvd;
	}
	
	public int retornaQntCad(){
		return qntDVDCadastrado;
	}
	
	public void lerArqSerializado(){
		try{
			FileInputStream readArq= new FileInputStream("MUSICAL.dat");
			ObjectInputStream readDvd = new ObjectInputStream(readArq);
			dvd = (Dvd[]) readDvd.readObject();
			for(int i = 0; i < qntDVDCadastrado; i++){
				System.out.print(dvd[i].retornaDVD());
			}
			readDvd.close();
			readArq.close();
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

}
package eseei.emprestimo.listar;

import java.io.*;

public class DvdCadastroFilme {
	BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));
	Dvd[] dvd;
	int qntDVDCadastrado = 0;
	
		public void cadastrarFilme(){
			String title, autor, yesOrno;
			int ano;
			
			try{
				//gerar arquivo para gravação
				FileOutputStream filmeArq = new FileOutputStream("FILMES.dat");
				//gerar objeto para gravar outros objetos
				ObjectOutputStream gravarFilme = new ObjectOutputStream(filmeArq);
				System.out.print("Deseja cadastrar algum DVD Filme?\n");
				yesOrno = buff.readLine();
				if(yesOrno.equals("sim")){
				System.out.print("Entre com a quantidade de DVD's para cadastrar\n");
					int numDeDvd = Integer.parseInt(buff.readLine());
					dvd = new Dvd[numDeDvd];
					for(int i = 0; i < numDeDvd; i++){
						System.out.println("Entre com o Título do DVD, " +
											"seguido do autor e o ano : ");
							title = buff.readLine(); autor = buff.readLine(); 
							ano = Integer.parseInt(buff.readLine());
							dvd[i] = new Dvd(title, autor, ano);
							++qntDVDCadastrado;
					}
				}else if(yesOrno.equals("não")){
					System.out.print("Nenhum DVD cadastrado!");
				}
				
				gravarFilme.writeObject(gravarFilme);
				gravarFilme.flush();
				gravarFilme.close();
				filmeArq.flush();
				filmeArq.close();
			}catch (Exception e) {
				// TODO: handle exception
				System.out.print("Erro na entrada de Dados! "+e.getMessage());
				e.printStackTrace();
			}
		}
		
		public Dvd[] retornaArrayDvdFilme(){
			return dvd;
		}
		
		public int retornaQntCad(){
			return qntDVDCadastrado;
		}
		
		public void lerArqSerializado(){
			try{
				FileInputStream readArq= new FileInputStream("FILMES.dat");
				ObjectInputStream readDvd = new ObjectInputStream(readArq);
				dvd = (Dvd[]) readDvd.readObject();
				for(int i = 0; i < qntDVDCadastrado; i++){	
					System.out.print(dvd[i].retornaDVD());
				}
				readArq.close();
				readArq.close();
			}catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}
}
package eseei.emprestimo.listar;

import java.io.*;


public class ListarDVD {
	BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));
	
	
	public void catalogaDVDCadastrados(int qntDVDCadastrado, Dvd[] dvd){
		try{
			System.out.print("Deseja verificar os DVD's de filme ou de músical/show?\n1 - Filme" +
					"\n2 - Musical/Show");
			int optReturnDVD = Integer.parseInt(buff.readLine());
				
			switch(optReturnDVD){
				case 1:
					for(int i = 0; i < qntDVDCadastrado; i++){
						System.out.print("\n"+dvd[i].retornaDVD()+"\n");
					}
						System.out.print("\nNúmero de DVD's cadastrados é de :" +
								" "+qntDVDCadastrado);
				break;
				
				case 2: 
					for (int i = 0; i < qntDVDCadastrado; i++) {
						System.out.print("\n"+dvd[i].retornaDVD()+"\n");
						dvd[i].retornaFaixa();
					}
						System.out.print("\nNúmero de DVD's cadastrados é de :" +
									" "+qntDVDCadastrado);
				break;	
			}

		}catch (Exception e) {
			// TODO: handle exception
			System.out.println("Erro na Entrada de Dados! "+e.getMessage());
			e.printStackTrace();
		}
	}
}
package eseei.emprestimo.listar;


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



public class Dvd implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String title, autor;
	private int ano;
	
	
	ArrayList<String> faixaDVD = new ArrayList<String>();
	
	
	public Dvd(String title, String autor, int ano){
		this.title = title;
		this.autor = autor;
		this.ano = ano;
	}
	
	
	public void incluirFaixa(String nomedaFaixa){
		faixaDVD.add(nomedaFaixa);
	}
	
	public void excluirFaixa(int faixaPos){
		faixaDVD.remove(faixaPos);
	}
	
	public String retornaDVD(){
		return "Título DVD : "+this.title+"\nAutor : "+this.autor+"\nAno : "+this.ano;
	}
	
	public void retornaFaixa(){
		int i = 1;
		for(String faixas : faixaDVD){
			System.out.print(i == 1? "	Faixas: "+(i++)+"."+faixas : "\n		"+(i++)+"."+faixas);
		}
	}
	
	

}

Meio extenso :~

aqui vão os erros

java.io.ObjectOutputStreamjava.io.NotSerializableException: java.io.ObjectOutputStream
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at eseei.emprestimo.listar.DvdCadastroFilme.cadastrarFilme(DvdCadastroFilme.java:37)
	at eseei.emprestimo.listar.DvdCadastro.runPrograma(DvdCadastro.java:18)
	at eseei.emprestimo.listar.DvdCadastro.main(DvdCadastro.java:50)

        //outros

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.io.ObjectOutputStream
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at eseei.emprestimo.listar.DvdCadastroFilme.lerArqSerializado(DvdCadastroFilme.java:61)
	at eseei.emprestimo.listar.DvdCadastro.runPrograma(DvdCadastro.java:21)
	at eseei.emprestimo.listar.DvdCadastro.main(DvdCadastro.java:50)
Caused by: java.io.NotSerializableException: java.io.ObjectOutputStream
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at eseei.emprestimo.listar.DvdCadastroFilme.cadastrarFilme(DvdCadastroFilme.java:37)
	at eseei.emprestimo.listar.DvdCadastro.runPrograma(DvdCadastro.java:18)
	... 1 more

7 Respostas

T

Os campos que não devem ser serializados não devem ser serializados, ou seja, você tem de marcá-los com transient.

Exemplo:

transient BufferedReader buff ......
hugown

thingol:
Os campos que não devem ser serializados não devem ser serializados, ou seja, você tem de marcá-los com transient.

Exemplo:

transient BufferedReader buff ......

mas isso na classe que implementa serializable??

Não entendi muito

T

É.

M

Acho que voce está serializando o objeto errado. (Para o problema da primeira Stack trace).

ObjectOutputStream gravarFilme = new ObjectOutputStream(filmeArq);    
              gravarFilme.writeObject(gravarFilme);

Voce está serializando seu OutputStream (o seu serializador). Na verdade acredito que voce deseja serializar um conjunto de DVDs.

Dvd[] dvd;  
              ObjectOutputStream gravarFilme = new ObjectOutputStream(filmeArq);    
              gravarFilme.writeObject(dvd);

Espero ter ajudado.

hugown

Edit@

Então, outra dúvida me passou. Como eu posso fazer para ler o arquivo que contém o objeto serializado antes de cria-lo, para verificar se já não existe ele, saca? :} Teria algum método “não-complicado”?haha

Desde já agradeço.
[]'s

M

Não entendi muito bem sua duvida,

mas para verificar se um arquivo existe antes de ler basta usar o comando

new File(caminhoArquivo).exists();

Este metodo da classe java.io.File retorna true se o arquivo já existe e false se não existe.

Caso o arquivo exista voce deverá ler o objeto dele, atraves da classe ObjectInputStream.

Apos lido o objeto, voce deve acrescentar o valor no array e ai então gravar o array conforme dito acima.

Abraços.

hugown

mezini:
Não entendi muito bem sua duvida,

mas para verificar se um arquivo existe antes de ler basta usar o comando

new File(caminhoArquivo).exists();

Este metodo da classe java.io.File retorna true se o arquivo já existe e false se não existe.

Caso o arquivo exista voce deverá ler o objeto dele, atraves da classe ObjectInputStream.

Apos lido o objeto, voce deve acrescentar o valor no array e ai então gravar o array conforme dito acima.

Abraços.

É isso mesmo! :smiley: Muito obrigado. \o

Criado 18 de novembro de 2008
Ultima resposta 19 de nov. de 2008
Respostas 7
Participantes 3