Salve ho una classe cliente, vorrei capire come mai , quando vado a inviare una sua istanza su un socket tramite un ObjectOutputStream, il server che riceve tale istanza , quando va a leggere il campo integer id_cliente, si verifica una NullPointerException.
codice:
package jCallRemember.libreria;


import java.io.Serializable;
import java.sql.Date;
import java.sql.Time;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Pattern;


/**
 *
 * Questa classe implementa un oggetto che
 * rappresenta un cliente. E definisce le caratteristiche di alcuni suoi campi
 * mediante l'utilizzo di espressioni regolari.
 */
public final class ClienteDB implements Serializable {


    private String statoAppuntamento;
    private Integer id_cliente;
    private String nome;
    private String cognome;
    private String telefono;
    private String mail;
    private java.util.Date primo_contatto;
    private java.sql.Date dataAppuntamento;
    private java.sql.Time oraAppuntamento;
    transient private static final String regexNome = "\\D{0,20}";
    transient private static final String regexCognome = "[a-zA-Z]{0,20}";
    transient private static final String regexMail = "(([a-zA-Z0-9._%-]{1,64})@([a-zA-Z0-9.-]{2,186})"
            + "\\.([a-zA-Z]{2,4}))?";
    transient private static final String regexTelefono = "([0-9]{5,12}){1}";


    public ClienteDB() {
    }


    /**
     * Costruttore con parametri
     *
     * @param nome
     * @param cognome
     * @param mail
     * @param tel
     */
    public ClienteDB(String nome, String cognome, String mail, String tel) {
        this.setNome(nome);
        this.setCognome(cognome);
        this.setMail(mail);
        this.setTelefono(telefono);
    }


    /**
     *
     * @return il valore del campo nome
     */
    public String getNome() {
        return nome;
    }


    /**
     * Imposta il campo nome dell'oggetto cliente
     *
     * @param nome
     */
    public void setNome(String nome) throws IllegalArgumentException {
        boolean error = !Pattern.matches(regexNome, nome);
        if (error) {
            throw new IllegalArgumentException("Formato del campo Nome"
                    + " non valido");
        }
        this.nome = nome;
    }


    public String getCognome() {
        return cognome;
    }


    /**
     * Imposta il valore del campo cognome dell'oggetto cliente
     *
     * @param cognome
     */
    public void setCognome(String cognome) throws IllegalArgumentException {
        boolean error = !Pattern.matches(regexCognome, cognome);
        if (error) {
            throw new IllegalArgumentException("Formato del campo Cognome"
                    + " non valido");
        }
        this.cognome = cognome;
    }
    /**
     * 
     * @return il numero di telefono del cliente
     */
    public String getTelefono() {
        return telefono;
    }


    /**
     * Imposta il valore del campo telefono, dell'oggetto cliente
     *
     * @param telefono
     */
    public void setTelefono(String telefono) throws IllegalArgumentException {
        boolean error = !Pattern.matches(regexTelefono, telefono);
        if (error) {
            throw new IllegalArgumentException("Formato del campo Telefono"
                    + " non valido");
        }
        this.telefono = telefono;
    }


    public String getMail() {
        return mail;
    }


    /**
     * Imposta il valore del campo mail dell'oggetto cliente
     *
     * @param mail
     */
    public void setMail(String mail) throws IllegalArgumentException {
        boolean error = !Pattern.matches(regexMail, mail);
        if (error) {
            throw new IllegalArgumentException("Formato del campo Mail"
                    + " non valido");
        }
        this.mail = mail;
    }


    /**
     *
     * @return la data dell'appuntamento del cliente
     */
    public Date getDataAppuntamento() {
        return dataAppuntamento;
    }


    /**
     * Imposta la data dell'Appuntamento del cliente, prendendo in input una
     * data dal formato dd/MMM/yyyy
     *
     * @param dataAppuntamento
     * @throws java.text.ParseException
     */
    public void setDataAppuntamento(String dataAppuntamento)
            throws NullPointerException,
            ParseException {
        if (dataAppuntamento == null) {
            throw new NullPointerException("Impostare Campo Data Appuntamento+"
                    + "\nValore Nullo non valido!");
        }
        SimpleDateFormat dataformat = new SimpleDateFormat("dd/MMM/yyyy");
        java.util.Date data = dataformat.parse(dataAppuntamento);
        this.dataAppuntamento = new java.sql.Date(data.getTime());
    }


    public void setDataAppuntamento(java.sql.Date data) throws
            NullPointerException {
        if (data != null) {
            this.dataAppuntamento = data;
        } else {
            throw new NullPointerException();
        }
    }


    /**
     *
     * @return l'ora dell'appuntamento del cliente
     */
    public Time getOraAppuntamento() {
        return oraAppuntamento;
    }


    /**
     * Imposta l'ora dell'appuntamento
     *
     * @param oraAppuntamento
     * @throws java.text.ParseException
     *
     */
    public void setOraAppuntamento(String oraAppuntamento)
            throws NullPointerException, ParseException {
        if (oraAppuntamento == null) {
            throw new NullPointerException("Impostare ora appuntamento,valore"
                    + " Nullo non valido!");
        }
        oraAppuntamento=oraAppuntamento.concat(":00");
        SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
        java.util.Date ora = sdf.parse(oraAppuntamento);
        this.oraAppuntamento = new java.sql.Time(ora.getTime());
        
    }


    public void setPrimo_contatto(java.util.Date primo_contatto) {
        this.primo_contatto = primo_contatto;
    }


    public void setOraAppuntamento(Time oraAppuntamento) {
        this.oraAppuntamento = oraAppuntamento;
    }


    public java.util.Date getPrimo_contatto() {
        return primo_contatto;
    }
    
    
    public Integer getId_cliente() {
        return id_cliente;
    }


    public void setId_cliente(Integer id_cliente) {
        this.id_cliente = id_cliente;
    }
    
    
    /**
     * Ritorna lo stato dell'appuntamento
     * @return 
     */
    public String getStatoAppuntamento() {
        return statoAppuntamento;
    }
    /**
     * 
     * @param statoAppuntamento 
     */
    public void setStatoAppuntamento(String statoAppuntamento) throws IllegalArgumentException {
        if(!statoAppuntamento.equals("PR") && !statoAppuntamento.equals("OK") &&
                !statoAppuntamento.equals("KO")){
            throw new IllegalArgumentException("Stato Appuntamento non valido");
        }
        this.statoAppuntamento = statoAppuntamento;
    }
    
    @Override
    public String toString(){
        return//this.getId_cliente().toString()+"\n"+
                this.getNome()+"\n"+
                this.getCognome()+"\n"+
                this.getMail()+"\n"+
                this.getTelefono()+"\n"+
                this.getPrimo_contatto().toString()+"\n"+
                this.getDataAppuntamento().toString()+"\n"+
                this.getOraAppuntamento().toString()+"\n"+
                this.getStatoAppuntamento()+"\n";
        
    }
}