Il seguente codice:Perché una classe interna serializzabile non è serializzabile?
public class TestInnerClass {
public static void main(String[] args) throws IOException {
new TestInnerClass().serializeInnerClass();
}
private void serializeInnerClass() throws IOException {
File file = new File("test");
InnerClass inner = new InnerClass();
new ObjectOutputStream(new FileOutputStream(file)).writeObject(inner);
}
private class InnerClass implements Serializable {
private static final long serialVersionUID = 1L;
}
}
genera la seguente eccezione:
Exception in thread "main" java.io.NotSerializableException: TestInnerClass
Credo che la classe interna ha un campo TestInnerClass.this
che permette l'accesso privato a TestInnerClass
s' campi e metodi. Dichiarando la classe interna statica solves it, ma cosa succede se InnerClass
ha bisogno di questo accesso? Esiste un modo per serializzare una classe interna non statica senza la classe di inclusione, ad es. facendo riferimento alla classe esterna transient
?
modifica: ad esempio, l'accesso alla classe esterna potrebbe essere necessario solo prima della serializzazione. OK, il compilatore non può saperlo, ma ho pensato che fosse il motivo per cui esiste la parola chiave transient
.
Hai provato a dichiarare la classe interna statica? 'Classe statica privata InnerClass' – gnat