Sto cercando di capire come funziona la serializzazione con Java e la sua ultima versione. Sto cercando di serializzare un lambda come questo:lambda serializzato e nessun serialVersionUID?
Runnable r = (Runnable & Serializable)() -> {System.out.println("This is a test");};
ma noto che non ho alcun avvertimento circa l'assenza di una variabile serialVersionUID
. È normale ?
so che verrà generato in fase di esecuzione tuttavia è fortemente raccomandato per definirla: https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html
Se una classe serializzabile non dichiara esplicitamente un serialVersionUID, quindi il runtime serializzazione calcolerà un predefinita serialVersionUID valore per quella classe in base ai vari aspetti della classe, come descritto nella Specifica di serializzazione Java (TM) Object . Tuttavia, si raccomanda che tutti classi serializzabili espressamente dichiarano valori serialVersionUID, poiché default serialVersionUID calcolo è molto sensibile alla classe particolari che possono variare a seconda implementazioni compilatore e può quindi favorire InvalidClassExceptions imprevisti durante deserializzazione. Pertanto, per garantire un valore serialVersionUID costante tra diverse implementazioni del compilatore java, una classe serializzabile deve dichiarare un valore serialVersionUID esplicito. Si consiglia inoltre esplicitamente che le dichiarazioni esplicite serialVersionUID utilizzino il modificatore privato laddove possibile, poiché tali dichiarazioni si applicano solo a la classe immediatamente dichiarante - i campi serialVersionUID non sono utili come membri ereditati. Le classi di array non possono dichiarare un serialVersionUID esplicito , in modo che abbiano sempre il valore calcolato predefinito, ma il requisito per la corrispondenza dei valori serialVersionUID non è valido per le classi di array .
Cosa devo fare? Come posso definirlo nel mio Lambda?
Grazie
Sembra che non ci sia modo di dichiarare un campo 'serialVersionUID' a causa della mancanza di una classe di definizione. E questo porta direttamente alla domanda successiva: per quale motivo dovrebbe essere serializzabile un lambda? Non ha campi e quindi nessun dato! – Seelenvirtuose
@Seelenvirtuose Un lambda serializzato contiene valori che sono stati catturati nel momento in cui è stata valutata la lambda. Se una lambda viene valutata più volte con diversi valori catturati, gli oggetti che incarnano i lambda saranno diversi, così come le loro rappresentazioni serializzate. –
@StuartMarks Ovviamente non ho pensato abbastanza lontano. Grazie per averlo indicato. In effetti, mi ha aiutato a cambiare (costruire?) La mia mente. – Seelenvirtuose