Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    deserializzazione oggetto trasferito sulla rete tramite UDP

    Salve a tutti

    avrei il seguente problema sulla deserializzazione di un oggetto inviato sulla rete tramite UDP.

    la riga di codice che dovrebbe ricostruire l'oggetto "prova=(persona)ois.readObject();" mi dà un eccezione del tipo ClassCastException.

    posto qui di seguito il codice del lato server (quello che mi dà l'eccezione):
    codice:
    import java.io.*;
    import java.net.*;
    
    public class UDPreceiver 
    {
    	public class persona implements Serializable
    	{
    		private static final long serialVersionID=1L;
    		private String nome;
    		private String cognome;
    		private int eta;
    		
    		public persona(String nome, String cognome, int Persona)
    		{
    			this.nome=nome;
    			this.cognome=cognome;
    			eta=Persona;
    		}
    		
    		String getNome()
    		{
    			return nome;
    		}
    		
    		String getCognome()
    		{
    			return cognome;
    		}
    		
    		int getEta()
    		{
    			return eta;
    		}
    	}
    	
    	
    	
    
        public static void main(String args[]) throws ClassNotFoundException, IOException
        {
                if(args.length!=1) throw new IOException("Uso: UDPReceiver <port>");
                byte buffer[] = new byte[65536];
                DatagramSocket dsocket = new DatagramSocket(Integer.parseInt(args[0]));
                DatagramPacket dpacket;
    
                while(true)
                {
                        System.out.println("In attesa di messaggi.....");
                        dpacket = new DatagramPacket(buffer, buffer.length);
                        dsocket.receive(dpacket);
                        persona prova=null;
                        
                        System.out.println("Ricevuto messaggio");
                        System.out.println("Mittente: " + dpacket.getAddress());
                        System.out.println("Porta: " + dpacket.getPort());
                        System.out.println("Lunghezza messaggio: " + dpacket.getLength());
                     
                        ByteArrayInputStream biStream = new   ByteArrayInputStream(dpacket.getData());
                        ObjectInputStream ois=new ObjectInputStream(biStream);
                       	prova=(persona)ois.readObject();                    	
                        System.out.println(prova.nome);
                        
                }
        }
    
    
    }
    Per ulteriore chiarezza posto anche il lato client che serializza l'oggetto da inviare:

    codice:
    import java.io.*;
    import java.net.*;
    import java.util.*;
    
    
    
    public class UDPsender 
    {
    	
    	public static class persona implements Serializable
    	{
    		private static final long serialVersionID=1L;
    		private String nome;
    		private String cognome;
    		private int eta;
    		
    		public persona(String nome, String cognome, int Persona)
    		{
    			this.nome=nome;
    			this.cognome=cognome;
    			eta=Persona;
    		}
    		
    		String getNome()
    		{
    			return nome;
    		}
    		
    		String getCognome()
    		{
    			return cognome;
    		}
    		
    		int getEta()
    		{
    			return eta;
    		}
    	}
    	
    	
    	
    	
    	static protected DatagramPacket buildPacket(String host, int port, persona studente) throws IOException 
    	{
    		InetAddress address=InetAddress.getByName(host);
    		
    		ByteArrayOutputStream bout=new ByteArrayOutputStream();
    		byte[] data=new byte[256];
    		DatagramPacket dp=new DatagramPacket(data,data.length,address,port);
    		
    				
    		ObjectOutputStream dout=new ObjectOutputStream(bout);
    		dout.writeObject(studente);
    		dout.flush();
    		data=bout.toByteArray();
    		dp.setData(data);
    		dp.setLength(data.length);
    		bout.reset();
    		return dp;		
    	}
    		
    		
    		public static void main(String [] args) throws IOException
    	    {
    		    if(args.length<5) throw new IOException("Uso: UDPSender <host> <port> <nome> <cognome> <età>");
                DatagramSocket dsocket = new DatagramSocket();
                DatagramPacket dpacket;
                
                
                persona studente=new persona(args[2],args[3],Integer.parseInt(args[4]));
                dpacket = buildPacket(args[0], Integer.parseInt(args[1]),studente);
                            
                dsocket.send(dpacket);
                System.out.println("Messaggio spedito");
           	}
    }
    Grazie a tutti!!!!!!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: deserializzazione oggetto trasferito sulla rete tramite UDP

    Originariamente inviato da pdicanio2004
    la riga di codice che dovrebbe ricostruire l'oggetto "prova=(persona)ois.readObject();" mi dà un eccezione del tipo ClassCastException.
    Infatti hai 2 classi 'persona' che non sono affatto la stessa cosa. Tra l'altro una è UDPsender.persona e l'hai fatta come "nested class" mentre l'altra è UDPreceiver.persona e l'hai fatta come "inner class".
    Sono diverse.

    Oltretutto UDPsender.persona hai dovuto farla nested perché nel main non hai una istanza della classe UDPsender.

    Le inner class sono classi un po' particolari, perché una istanza di una inner class deve sempre essere associata (ed è quindi legata) ad una istanza della classe che la contiene.

    Se non conosci bene le inner/nested class ... evita di usarle. Come soluzione: metti la tua classe 'persona' come classe "top level" (fuori da ogni classe) e che sia unica e comune al client e server.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    La classe persona contenuta all'interno della classe UDPreceiver è ovviamente diversa da quella contenuta all'interno di UDPsender: la prima, infatti, si chiama UDPreceiver.persona, la seconda si chiama UDPsender.persona.

    Se vuoi trasmettere delle informazioni in rete, queste devono essere capite da entrambi. Soluzione: la classe persona deve risiedere in un file separato a se stante e non contenuta all'interno di un'altra classe.

    PS: perchè non segui le normali regole di nomenclatura per le classi? I nomi delle classi si scrivono in maiuscolo...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    A quanto pare il problema era proprio quello, come ho fatto a non capirlo

    grazie a tutti

    PS: perchè non segui le normali regole di nomenclatura per le classi? I nomi delle classi si scrivono in maiuscolo...
    Hai perfettamente ragione ma doveva essere un semplice programmino di prova... Cmq è bene abituarsi e utilizzare sempre una corretta nomenclatura eheheh

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.