Sockets - Problema com serialização de objetos

8 respostas
E

Olá…
Em minha aplicação utilizo um Objeto chamado Propriedades, que encapsulam as propriedades de um determinado vídeo…

Segue abaixo a classe:

public class Propriedades extends Informacao implements java.io.Serializable
{
	private String versao;
        private String data;
        private String autor;
        private String local;
	
	public Propriedades(String versao, String data, String autor, String local)
        {
            super(TipoDeInformacao.PROPRIEDADES_DE_VIDEO);
            this.versao = versao;
            this.data   = data;
            this.autor  = autor;
            this.local  = local;
	}
	
        public TipoDeInformacao getTipoDeInformacao()
        {
            return super.getTipoDeInformacao();
        }
        
	public String getData(){	return data;	}
	public String getVersao(){	return versao;	}
	public String getLocal(){	return local;	}
	public String getAutor(){	return autor;	}
	
        public boolean equals(Propriedades propriedades)
        {
            if( (this.versao).equals(propriedades.getVersao()) &&
                (this.autor).equals(propriedades.getAutor()) &&
                (this.local).equals(propriedades.getLocal()) &&
                (this.data).equals(propriedades.getData()))
            {
                return true;
            }    
            
            return false;
        }
	
        public String toString()
        {
            if(!autor.equals(""))
            {
                return autor; 
            }
            else if( !local.equals("") )
            {
                return local;
            }
            else if( !data.equals("") )
            {
                return data;
            }
            else if( !versao.equals("") )
            {
                return versao;
            }

            return "";
         }
}

Minha aplicação é baseada no modelo cliente-servidor e objetos Propriedades circulam na rede entre os Clientes e o Servidor. Esses objetos são jogados e recebidos na rede através de Sockets…Todavia adotei como padrão a troca de objetos Mensagem, assim, as propriedades são encapsuladas em Objetos Mensagem:

import java.io.Serializable;
/**
 *
 * @author usuario
 */
public class Mensagem <T>  implements Serializable
{    
    private TipoDeMensagem tipoDeMensagem;//É um enum    
    private T dados;    
  
    public Mensagem(TipoDeMensagem tipoDeMensagem)
    {
        this.tipoDeMensagem = tipoDeMensagem;
        this.dados = null;
    }
    
    public Mensagem(TipoDeMensagem tipoDeMensagem, T dados)
    {
        this.tipoDeMensagem = tipoDeMensagem;
        this.dados = dados;
    }
    
    public TipoDeMensagem getTipoDeMensagem()
    {
        return tipoDeMensagem;
    }
    
    public T getDados()
    {
        return this.dados;
    }
}

Eu envio uma Mensagem que carrega as Propriedades com o seguinte trecho de código:

Mensagem<Propriedades> mensagemPropriedades = new Mensagem(TipoDeMensagem.TRANSPORTE_PROPRIEDADES_DE_VIDEO,propriedadesDeVideo);
saidaObjeto.writeObject(mensagemPropriedades);
saidaObjeto.flush();

Onde “saidaObjeto” é um ObjectOutputStream.

E recebo uma Mensagem que carrega as Propriedades com o seguinte código:

Mensagem<Propriedades> mensagemPropriedades = (Mensagem<Propriedades>)entradaObjeto.readObject();

Todavia, no exato trecho acima, minha aplicação gera uma exceção:
[color=red]
java.io.InvalidClassException: processamento.cadastro.Propriedades; processamento.cadastro.Propriedades; no valid constructor[/color]

[color=blue]at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:713)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1733)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)

at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)

at trecho acima[/color]

Gostaria de saber o que pode estar havendo…

8 Respostas

fiaux

Sei lá… tô chutando depois de ler a mensagem, pois, nunca trabalhei com serialização assim. Você não precisa declarar um construtor default na classe Propriedade? Lá já tem um, mas não precisaria do default declarado?

Ricna

Me “parece” que é problema no construtor:

no valid constructor
hehehe

Faz alguns testes para ver que tipo de classe que realmente esta chegando aí.

E não precisaria converter para Serializable antes?

Serializable aux = (Serializable) entradaObjeto.readObject(); Mensagem<Propriedades> mensagemPropriedades = (Mensagem<Propriedades>) aux;

Ricna

Com certeza! Boa sacada…

Você declarou um construtor que recebe parâmetros, isso anula o construtor default que existiria se vc não declarasse nenhum outro.

Nesse caso você precisa declarar o construtor:

public Propriedades(){ }

E

Olha…Ao que tudo indica não é esse o problema…

Inicialmente descartei a hipótese de cara, porque, o construtor padrão existe independente da declaração…Todavia, lembei-me que esta classe extende outra, cuja construtor ecebe parâmetros. Ai pensei: “Bem, talvez neste caso seja necessário explicitar o construtor padrão da classe, fazendo a chamada ao construtor da superclasse”…Então o fiz…

public Propriedades()
{
       super(TipoDeInformacao.PROPRIEDADES_DE_VIDEO);
}

Mesmo assim o problema persiste…

E

Resolvi…

E não consigo acreditar…Estou em sentindo uma besta mesmo!
Depois de responder ao tópico pela última vez, quando falei que essa classe é filha de uma outra, lembrei que essa outra também deveria ser Serializável…

Dei um implements Serialiable na classe pai e tudo funcionou magicamente…

Desculpem o transtorno…Ando meio desconcentrado ultimamente…

Ricna

Acontece… rss

Fernando_Generoso_da

eclipso:
Olha…Ao que tudo indica não é esse o problema…

Inicialmente descartei a hipótese de cara, porque, o construtor padrão existe independente da declaração…

Apenas corrigindo…

O construtor padrão apenas existe se tu não declarar NENHUM construtor na classe ou tu declarar o construtor sem parâmetros (default) EXPLICITAMENTE. SE tu tiver um construtor com parâmetros na tua classe e NÃO ter um construtor sem parâmetros, o construtor default NÃO IRÀ EXISTIR.

Fernando

E

Isso…Estava fazendo confusão…
Deixei bem clara minha impressão pra ver se alguém corrigia :smiley:

Criado 15 de julho de 2008
Ultima resposta 16 de jul. de 2008
Respostas 8
Participantes 4