No puedo leer objetos con readObject (sockets)

Buen dia compañeros, tengo un problema al querer leer clases objeto con readObject de ObjectInputStream.

Intento iniciar un objeto Avion en la clase SocketAvion y pasarlo por WriteObject y recibirlo en la clase ServidorHilo con readObject pero al mostrarlo me muestra un nuevo Avion y no el avion que envio ¿Alguna sugerencia o como puedo hacer este procedimiento?

Gracias

Clase avion Serializable

import java.io.*;

public class Avion implements java.io.Serializable {
        static int num ;
        static String des;
        static int numeroPasajeros ;
       
        public Avion() {
        }
       
        public Avion(int numero, String destino, int pasajeros) {
                num = numero;
                des = destino;
                numeroPasajeros = pasajeros;
        }
               
        @Override
        public String toString()  {
                return "Viaje: " + num + " Destino: " + des + " Numero pasajeros " + numeroPasajeros;
        }
}

Mi clase Servidor

import java.io.*;
import java.net.*;

public class Cabina {
        ServerSocket server;
        Socket socket;

    public Cabina() {
        System.out.println("Inicializando servidor");
       
        try {
                server = new ServerSocket(9100);
                System.out.println("Esperando conexion de aviones");
                while(true) {
                        socket = server.accept();
                        System.out.println("nuevo avion entrante");
                        ServidorHilo SH = new ServidorHilo(socket);
                        SH.start();
                }
        }catch(Exception e){
        }
    }
       
    public static void main(String a[]) {
        Cabina c = new Cabina();
    }  
}

Mi clase SocketCliente

import java.io.*;
import java.net.Socket;
import java.util.*;

public class SocketAvion {
        private Socket cliente;
        private OutputStream salida = null;
        private ObjectOutputStream salida1 = null;
        private DataInputStream entrada;

    public void conexion() {
        try{
   
        cliente = new Socket("127.0.0.1", 9100);
        Avion a = new Avion(900,"Paris",200);
        System.out.println(a);

 
        salida1 = new ObjectOutputStream(cliente.getOutputStream());
        entrada = new DataInputStream(cliente.getInputStream());
       
       
        salida1.writeObject(a);
       
        entrada.close();
        salida1.close();
        cliente.close();
        }catch(Exception e){
         System.out.println(e);
        }      
    }
   
    public static void main(String a[]) {
        SocketAvion sa = new SocketAvion();
        sa.conexion();
    }
       
}

y por ultimo y donde tengo el problema la clase socketServidor

import java.io.*;
import java.net.*;

public class ServidorHilo extends Thread{
        private Socket socket;
        private PrintStream salida;
        private InputStream entrada;
        private ObjectInputStream entrada1 = null;
       
       
    public ServidorHilo(Socket socket1) {
        socket = socket1;
    }
   
   @Override
        public void run() {
                try{
                salida = new PrintStream(socket.getOutputStream());
                //Avion a = new Avion();
                entrada1 = new ObjectInputStream(socket.getInputStream());
                Avion a = (Avion)entrada1.readObject();
                System.out.println(a); 
                       
                } catch(Exception e) {
                        System.out.println(e);
                }  
                desconectar();
        }
       
       
    public void desconectar() {
        try {
            socket.close();
        } catch (Exception e) {
           
        }
   }
}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Es porque los atributos de la

Es porque los atributos de la clase avión son de clase ( están marcados como static ) y los atributos de clase no se serializan. Conviertelos a de instancia y listo.

ejemplo:

class A implements Serializable {
   int static a; // no se serializa
   transient int b; // no se serializa
   int c;  // si se serializa
}

Por cierto, si no vas a usar los objetos no tienes que inicializarlos

        salida1 = new ObjectOutputStream(cliente.getOutputStream());
        entrada = new DataInputStream(cliente.getInputStream()); // no se usa

Y recomendación extra, revisa que tu código quede bien indentado (y consistente*) cuando postees, hace mucho más fácil leerlo.

*tabs o espacios para indentar pero no ambos, llaves que inician al final de la línea, etc.

Imagen de hitzu

Gracias

Wow! muchas gracias por tu respuesta, efectivamente una ves que le quito el static ya funciona el programa.

referente a los objetos inicializados, es porque si los estoy ocupando pero como solo tenia problema en el readObject quite el codigo restante.

Y tomare en cuenta el comentario de la indentación.

De nuevo muchas gracias.

Es lo que imaginé. Muchas

Es lo que imaginé. Muchas veces ayuda hacer un programa aparte separando el problema que quieres resolver.

Esto ayuda por:

1. Muchas veces al separarlo te das cuenta del problema
2. Lo puedes pegar en foros como este sin tener que estar quitando o no quitando líneas
3. El que lo lee puede ( si quiere ) ejecutarlo y/o leerlo sin distraerse en cosas que no son relevantes.

En ocasiones al separarlo tu código ya funciona y te puede ayudar a detectar donde está la diferencia.

Lo de la identación es también un plus para que alguien pueda leerlo más fácilmente y aunque trabajes solo hacerlo siempre te ayuda a que se vuelva un hábito.