LINK ALLA ESERCITAZIONE: https://github.com/Apress/beg-spring...data-rest-demo

Perché User.java ha “private static final long serialVersionUID = 1L;” mentre le altre classi no? Ho letto una montagna di pagine su questa stringa ma non ho capito a che serve. Non capisco perché User.java ha questa variabile e le altre classi no. È tutto molto strano.
Su internet si legge che in informatica, la serializzazione è un processo per salvare un oggetto in un supporto di memorizzazione lineare, o per trasmetterlo su una connessione di rete. La serializzazione può essere in forma binaria o può utilizzare codifiche testuali direttamente leggibili dagli esseri umani. Lo scopo della serializzazione è di trasmettere l'intero stato dell'oggetto in modo che esso possa essere successivamente ricreato nello stesso identico stato dal processo inverso, chiamato deserializzazione.
In questa prima parte si parla di “STATO DELL’OGGETTO”. Con quest’ultima definizione si intende “ISTANZA DELL’OGGETTO”?
Molto semplicisticamente mi immagino questo scenario. Sul HD c’è la classe che si trova dentro il .war. Quando la WebApp si avvia la CPU legge la classe, la popola di stringhe e numeri (nomi di utenti, età, date, ecc…) e salva il contenuto di questo oggetto dentro la RAM.
Per ‘intero stato dell’oggetto’ si intende ‘struttura dell’oggetto + dati immagazzinati al suo interno’?
Procedendo nella descrizione leggo che la deserializzazione utilizza questo numero “serialVersionUID” per garantire che una classe caricata (ovvero contenente dati, ovvero istanziata) corrisponda esattamente a un oggetto serializzato. Se non viene trovata alcuna corrispondenza, InvalidClassException genera un’eccezione. Se “serialVersionUID” non viene assegnato dal programmatore Java ne assegna uno casuale calcolato in qualche modo.
È proprio in questo ultimo punto che perdo il filo del discorso. Mi sembra di capire che una classe istanziata modificata generi un errore perché nell’istante in cui si modifica una classe istanziata “serialVersionUID” cambia. Se User.java contiene la password dell’utente e un malintenzionato modifica la password della classe istanziata e serializzata dentro la RAM “serialVersionUID” cambia e la WebApp genera un errore impedendo al malintenzionato di accedere a risorse private. In questo caso “serialVersionUID” ha un’utilità ma se io voglio usare un oggetto più volte modificandolo e la WebApp collassa dopo ogni modifica solo dolori. Inoltre se “serialVersionUID” viene assegnato da Java in automatico e quindi presumo dalla JDK oppure da JRE perché assegnare “serialVersionUID” ad alcune classi e ad altre no? Non ne comprendo proprio la ragione. Forse “serialVersionUID” cambia quando non è Java a modificare una classe istanziata e forse “serialVersionUID” su User.java non serve ad un piffero, infatti se tolto “private static final long serialVersionUID = 1L;” da User.java tutto funziona alla perfezione, eppure il programmatore anche nelle altre esercitazioni su User.java mette sempre questo “serialVersionUID” che mi manda in tilt. Inoltre se Java assegna già un “serialVersionUID” ed effettua già lui un controllo su questa variabile che mi importa se vale 1L oppure 100L oppure ancora 1234L? Mah...

Un grazie in anticipo a chi saprà, senza paroloni e concetti complicati, chiarirmi questo ingarbuglio.