Serializzare classe super classe e sotto classe

di il
8 risposte

Serializzare classe super classe e sotto classe

Salve ragazzi ho un problema nella serializzazione ho una super classe abstract cliente e ho due classi che sono sotto classi di cliente ovvero clienteOro e clienteOrdinario, il mio problema é che quando provo a serializzare i figli non mi ritrovo gli attributi del padre settati a dovere questa é la chiamata che faccio nella classe clienteOro


	@Override
	public void readExternal(ObjectInput in) throws IOException,
			ClassNotFoundException {
		percentualeDiSconto =in.readInt();
		
	}

	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
		out.writeInt(percentualeDiSconto);
		
	}

}

8 Risposte

  • Re: Serializzare classe super classe e sotto classe

    broke31 ha scritto:


    il mio problema é che quando provo a serializzare i figli non mi ritrovo gli attributi del padre settati a dovere
    Se la classe base non è marcata Serializable, la (de)serializzazione giustamente non prende in considerazione il suo "stato".
    Devono essere le sottoclassi a farsi carico di (de)serializzare lo stato della super-classe. Il punto è che se ne hai diverse di sotto-classi, dovresti ripetere questa gestione, quindi secondo me ti conviene valutare se rendere la classe base serializzabile.
  • Re: Serializzare classe super classe e sotto classe

    Ho tutte le classi serializzabili ed esternabilia lo stesso i dati scritti non sono quelli desiderati...
  • Re: Serializzare classe super classe e sotto classe

    broke31 ha scritto:


    Ho tutte le classi serializzabili ed esternabilia lo stesso i dati scritti non sono quelli desiderati...
    Se implementi java.io.Externalizable, tutto (e ripeto tutto) lo "stato" dell'oggetto è a tuo carico per quanto riguarda serializzazione/deserializzazione.

    E comunque senza vedere bene un po' tutto il codice che hai scritto mi è difficile capire cosa non va.
  • Re: Serializzare classe super classe e sotto classe

    Questa è la classe padre :
    
    
    import java.io.Externalizable;
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectOutput;
    import java.io.Serializable;
    
    
    
    public abstract class Cliente implements Cloneable,Calcolabile<Integer>,Serializable,Externalizable{
    	private String nome;
    	private int id;
    	private static int contId;
    	private String numeroTelefonico;
    	private Indirizzo indirizzo; 
    
    
    
    
    
    
    	public Cliente() {
    
    		nome= "";
    		id = contId++;
    		numeroTelefonico= "";
    		setIndirizzo(new Indirizzo("",0));
    
    	}
    
    
    
    	public Cliente(String nome,  String numeroTelefonico,
    			Indirizzo indirizzo) {
    		//if(this.nome.equalsIgnoreCase(nome)) throw new IllegalArgumentException();
    		this.nome = nome;
    		this.id = contId++;
    		this.numeroTelefonico = numeroTelefonico;
    		this.setIndirizzo(indirizzo.clone());
    	}
    
    
    
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Cliente other = (Cliente) obj;
    		if (id != other.id)
    			return false;
    		if (getIndirizzo() == null) {
    			if (other.getIndirizzo() != null)
    				return false;
    		} else if (!getIndirizzo().equals(other.getIndirizzo()))
    			return false;
    		if (nome == null) {
    			if (other.nome != null)
    				return false;
    		} else if (!nome.equals(other.nome))
    			return false;
    		if (numeroTelefonico == null) {
    			if (other.numeroTelefonico != null)
    				return false;
    		} else if (!numeroTelefonico.equals(other.numeroTelefonico))
    			return false;
    		return true;
    	}
    
    
    
    
    
    	@Override
    	public String toString() {
    		return "Cliente [nome=" + nome + ", id=" + id + ", numeroTelefonico="
    				+ numeroTelefonico + ", indirizzo=" + getIndirizzo() + "]";
    	}
    
    
    
    	public Cliente clone(){
    
    		Cliente app;
    		try {
    			app = (Cliente)super.clone();
    			app.indirizzo =this.indirizzo.clone();
    			return app;
    		} catch (CloneNotSupportedException e1)
    		{
    			return null;
    		}
    
    
    	}
    
    
    	public String getNome() {
    		return nome;
    	}
    
    	public void setNome(String nome) {
    		this.nome = nome;
    	}
    
    	public int getId() {
    		return id;
    	}
    
    	public void setId(int id) {
    		this.id = id;
    	}
    
    	public static int getContId() {
    		return contId;
    	}
    
    	public static void setContId(int contId) {
    		Cliente.contId = contId;
    	}
    
    	public String getNumeroTelefonico() {
    		return numeroTelefonico;
    	}
    
    	public void setNumeroTelefonico(String numeroTelefonico) {
    		this.numeroTelefonico = numeroTelefonico;
    	}
    
    
    
    	public Indirizzo getIndirizzo() {
    		return indirizzo;
    	}
    
    
    
    	public void setIndirizzo(Indirizzo indirizzo) {
    		this.indirizzo = indirizzo;
    	}
    
    
    	@Override
    	public  void readExternal(ObjectInput in) throws ClassNotFoundException, IOException{
    		this.nome=(String) in.readObject();
    		this.id = in.readInt();
    		this.contId= in.readInt();
    		this.numeroTelefonico= (String) in.readObject();
    		this.indirizzo = (Indirizzo) in.readObject();
    
    
    	}
    
    
    
    	@Override
    	public void writeExternal(ObjectOutput out) throws IOException{
    
    		out.writeObject(nome);
    		out.writeInt(id);
    		out.writeInt(contId);
    		out.writeObject(numeroTelefonico);
    		out.writeObject(indirizzo);
    
    
    	}
    
    
    }
    
    

    queste sono le classi figlie:
    
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectOutput;
    
    
    public class ClienteOrdinario extends Cliente implements Cloneable {
    
    	private int percentualeDiSconto;
    
    	public ClienteOrdinario() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    
    	public ClienteOrdinario(String nome, String numeroTelefonico,
    			Indirizzo indirizzo,int percentualeDiSconto) {
    		super(nome,  numeroTelefonico, indirizzo);
    		try{
    			if(percentualeDiSconto>=0 && percentualeDiSconto<=5)
    				this.percentualeDiSconto = percentualeDiSconto;
    			else
    				throw new PercentualeDiScontoExepetion();
    		}catch(PercentualeDiScontoExepetion e){
    			System.out.println("percentuale di scotno negativa");
    		}
    
    	}
    
    
    
    	@Override
    	public String toString() {
    		return super.toString()+getClass().getSimpleName()+" [percentualeDiSconto=" + percentualeDiSconto
    				+ "]";
    	}
    
    
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (!super.equals(obj))
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		ClienteOrdinario other = (ClienteOrdinario) obj;
    		if (percentualeDiSconto != other.percentualeDiSconto)
    			return false;
    		return true;
    	}
    
    
    
    	public ClienteOrdinario clone()
    	{
    		return (ClienteOrdinario) super.clone();
    	}
    
    	@Override
    	public Integer calcolaPrezzo(Integer importo) {
    		importo = importo*percentualeDiSconto/100;
    		return importo;
    	}
    
    	public int getPercentualeDiSconto() {
    		return percentualeDiSconto;
    	}
    
    	public void setPercentualeDiSconto(int percentualeDiSconto) {
    
    
    		try {
    			if(percentualeDiSconto>=0&&percentualeDiSconto<=5){
    				this.percentualeDiSconto = percentualeDiSconto;
    				throw new PercentualeDiScontoExepetion();
    			}
    		} 
    		catch (PercentualeDiScontoExepetion e) {
    			System.out.println("percentuale errata");
    		}
    
    	}
    
    	@Override
    	public void readExternal(ObjectInput in) throws IOException,
    	ClassNotFoundException {
    		percentualeDiSconto =in.readInt();
    
    	}
    
    	@Override
    	public void writeExternal(ObjectOutput out) throws IOException {
    		out.writeInt(percentualeDiSconto);
    
    	}
    
    }
    
    
    
    questa è la seconda classe figlia:
    
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectOutput;
    import java.text.ParseException;
    
    
    public class ClienteOro extends Cliente implements Cloneable{
    
    	private Profilo profilo;
    	private int percentualeDiSconto;
    	int bonus;
    	public ClienteOro() {
    		profilo  = new Profilo(" ");
    		percentualeDiSconto =  0;
    		bonus =100;
    
    	}
    
    	public ClienteOro(String nome,  String numeroTelefonico,
    			Indirizzo indirizzo,Profilo profilo, int percentualeDiSconto) {
    		super(nome,  numeroTelefonico, indirizzo);
    		this.profilo = profilo;
    		try {
    			if(percentualeDiSconto>=10&& percentualeDiSconto<=20)
    				this.percentualeDiSconto = percentualeDiSconto;
    
    			else 
    				throw new PercentualeDiScontoExepetion();
    		}
    		catch(PercentualeDiScontoExepetion e)
    		{
    			System.out.println("errore");
    		}
    		this.bonus =100;
    
    
    	}
    
    	public Profilo getProfilo() {
    		return profilo.clone();
    	}
    	public void setProfilo(Profilo profilo) {
    		this.profilo = profilo.clone();
    	}
    	public int getPercentualeDiSconto() {
    		return percentualeDiSconto;
    	}
    	public void setPercentualeDiSconto(int percentualeDiSconto) throws PercentualeDiScontoExepetion {
    		if(percentualeDiSconto>=10&& percentualeDiSconto<=20)
    			this.percentualeDiSconto = percentualeDiSconto;
    		else new PercentualeDiScontoExepetion();
    	}
    	public int getBonus() {
    		return bonus;
    	}
    	public void setBonus(int bonus) {
    		this.bonus = bonus;
    	}
    	@Override
    	public String toString() {
    		return super.toString()+getClass().getSimpleName()+" [profilo=" + profilo + ", percentualeDiSconto="
    				+ percentualeDiSconto + ", bonus=" + bonus + "]";
    	}
    
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (!super.equals(obj))
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		ClienteOro other = (ClienteOro) obj;
    		if (bonus != other.bonus)
    			return false;
    		if (percentualeDiSconto != other.percentualeDiSconto)
    			return false;
    		if (profilo == null) {
    			if (other.profilo != null)
    				return false;
    		} else if (!profilo.equals(other.profilo))
    			return false;
    		return true;
    	}
    
    
    	public ClienteOro  clone()
    	{
    		ClienteOro app = new  ClienteOro(); 
    		app.profilo = this.profilo.clone();
    		app=(ClienteOro) super.clone();
    		return app;
    	}
    
    	@Override
    	public Integer calcolaPrezzo(Integer importo) {
    		if(importo>=bonus)
    		{
    			importo =(importo-bonus)*percentualeDiSconto/100; 
    			bonus=0;
    			return importo;
    		}
    		//else
    		bonus =bonus-importo;
    		return 0;
    	}
    
    	@Override
    	public void readExternal(ObjectInput in) throws IOException,
    	ClassNotFoundException {
    		profilo=(Profilo) in.readObject();
    		percentualeDiSconto = in.readInt();
    		bonus = in.readInt();
    
    	}
    
    	@Override
    	public void writeExternal(ObjectOutput out) throws IOException {
    		out.writeObject(profilo);
    		out.writeInt(percentualeDiSconto);
    		out.writeInt(bonus);
    
    	}
    
    }
    
    
    
    e questo è il mio main
    
    
    
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    
    public class testerMain {
    
    	public static void main(String[] args) {
    		ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();
    		ClienteOrdinario clienteOrd1,clienteOrd2,clienteOrd3,clienteOrd4,clienteOrd5;
    		ClienteOro  clienteOro1,clienteOro2,clienteOro3,clienteOro4,clienteOro5;
    		clienteOrd1 = new ClienteOrdinario("marco", "081", new Indirizzo("ciao", 0), 3);
    		clienteOrd2 = new ClienteOrdinario("marco", "081", new Indirizzo("ciao", 0), 3);
    		clienteOrd3 = new ClienteOrdinario("marco", "081", new Indirizzo("ciao", 0), 3);
    		clienteOrd4 = new ClienteOrdinario("marco", "081", new Indirizzo("ciao", 0), 3);
    		clienteOrd5 = new ClienteOrdinario("marco", "081", new Indirizzo("ciao", 0), 3);
    
    		clienteOro1 = new ClienteOro("giovanni","065", new Indirizzo("bis",3),new Profilo("bohh"),12);
    		clienteOro2 = new ClienteOro("giovanni","065", new Indirizzo("bis",3),new Profilo("bohh"),12);
    		clienteOro3 = new ClienteOro("giovanni","065", new Indirizzo("bis",3),new Profilo("bohh"),12);
    		clienteOro4 = new ClienteOro("giovanni","065", new Indirizzo("bis",3),new Profilo("bohh"),12);
    		clienteOro5 = new ClienteOro("giovanni","065", new Indirizzo("bis",3),new Profilo("bohh"),12);
    		try {
    			ObjectInputStream fileInputStream = new ObjectInputStream(new FileInputStream(new File("prova.dat")));
    			listaCliente=(ArrayList<Cliente>) fileInputStream.readObject();
    			clienteOrd1=(ClienteOrdinario) listaCliente.get(0);
    			clienteOrd2=(ClienteOrdinario) listaCliente.get(1);
    			clienteOrd3=(ClienteOrdinario) listaCliente.get(2);
    			clienteOrd4=(ClienteOrdinario) listaCliente.get(3);
    			clienteOrd5=(ClienteOrdinario) listaCliente.get(4);
    			clienteOro1=(ClienteOro) listaCliente.get(5);
    			clienteOro2=(ClienteOro) listaCliente.get(6);
    			clienteOro3=(ClienteOro) listaCliente.get(7);
    			clienteOro4=(ClienteOro) listaCliente.get(8);
    			clienteOro4=(ClienteOro) listaCliente.get(9);
    			fileInputStream.close();
    		} catch (FileNotFoundException e) {
    
    			listaCliente.add(clienteOrd1);
    			listaCliente.add(clienteOrd2);
    			listaCliente.add(clienteOrd3);
    			listaCliente.add(clienteOrd4);
    			listaCliente.add(clienteOrd5);
    			listaCliente.add(clienteOro1);
    			listaCliente.add(clienteOro2);
    			listaCliente.add(clienteOro4);
    			listaCliente.add(clienteOro3);
    			listaCliente.add(clienteOro5);
    			ObjectOutputStream file;
    			try {
    				file = new ObjectOutputStream(new FileOutputStream(new File("prova.dat")));
    				file.writeObject(listaCliente);
    				file.close();
    			} catch (IOException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    
    
    
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    
    
    	}
    
    }
    
    
    l'esercizio chiedeva vedere se il file prova è presente nel file system nel caso il file non esiste creare 10 istanze di oggetti figli(5 clienti oro e 5 clienti ordinari) ma non ci riesco in nessun modo
  • Re: Serializzare classe super classe e sotto classe

    broke31 ha scritto:


    public abstract class Cliente implements Cloneable,Calcolabile<Integer>,Serializable,Externalizable{
    	private String nome;
    	private int id;
    	private static int contId;
    	private String numeroTelefonico;
    	private Indirizzo indirizzo; 
    
    [....]
    
    	@Override
    	public  void readExternal(ObjectInput in) throws ClassNotFoundException, IOException{
    		this.nome=(String) in.readObject();
    		this.id = in.readInt();
    		this.contId= in.readInt();
    		this.numeroTelefonico= (String) in.readObject();
    		this.indirizzo = (Indirizzo) in.readObject();
    	}
    
    Scusa ma ..... se tutti i campi devono essere serializzabili, perché andare a scomodare Externalizable??? Usa solo Serializable e lascia fare alla serializzazione degli oggetti predefinita .....
  • Re: Serializzare classe super classe e sotto classe

    Ma externalizable non mi serve quando devo andare a leggere il file?
  • Re: Serializzare classe super classe e sotto classe

    broke31 ha scritto:


    ma externalizable non mi serve quando devo andare a leggere il file?
    File? Che centra il file ......
    La (de)serializzazione funziona allo stesso modo che sia lo stream di un file, lo stream di un socket o ancora lo stream di un campo BLOB su un DB. Non centra dove va (o da dove arriva) il "flusso" di byte serializzato.

    Per usare la serializzazione a livello basilare basta Serializable. Externalizable va oltre nel senso che delega interamente al programmatore il compito di (de)serializzare lo stato dell'oggetto. E ovviamente ha senso solo in situazioni davvero particolari.
  • Re: Serializzare classe super classe e sotto classe

    Ma lo stesso non ci riesco viene sempre richiamato il costruttore di default anche se ho tolto externalizambe
Devi accedere o registrarti per scrivere nel forum
8 risposte