Domanda

Qualche mese fa ho serializzato un oggetto java.io.Serializable in un file. Ora ho bisogno di leggere i contenuti, ma da allora serialVersionUID è cambiato e ora sto ottenendo una "classe incompatibile" errore. So per certo che nessuno dei membri dei dati è cambiato, quindi l'unica barriera è il controllo serialVersionUID.

Esiste un modo per disabilitare il controllo o modificare serialVersionUID nel file binario?

Chiarimento

Questa domanda presuppone che non sia possibile modificare l'origine. C'è un modo in cui posso hackerare il file .class o forse hackerare il file oggetto serializzato (usare un editor esadecimale e modificare un valore con un certo offset)?

È stato utile?

Soluzione

Come hack, puoi generare il serialVer che probabilmente il tuo jvm sta usando usando lo strumento serialver:

serialver -classpath qualunque com.foo.bar.MyClass

Se poi imposti manualmente serialVerUID nella tua classe, questo dovrebbe corrispondere e dovresti essere in grado di caricare, supponendo che tu non abbia cambiato la classe in modo da invalidarla.

Altri suggerimenti

Perché non modificare serialVersionUID nella versione corrente invece come descritto in Serializzazione documentazione?

Di recente mi sono trovato in una situazione simile - avevo alcuni oggetti serializzati che dovevo leggere, il serialVersionUID di quegli oggetti era diverso dalla versione più recente e, nel mio caso, c'erano un paio di serialVersionUID diversi memorizzati nel file per la stessa classe (memorizzati in momenti diversi, ovviamente). Quindi non ho avuto il lusso di modificare la classe e impostare il suo serialVersionUID ; In realtà ho dovuto accedere e modificare i dati memorizzati.

Quello che ho capito (leggendo il codice sorgente java.io) è che un oggetto viene serializzato memorizzando prima il nome della classe (usando writeUTF () ) e subito dopo aver usato writeLong () per salvare il serialVersionUID .

La mia soluzione era catturare l'eccezione, quindi tornare indietro, cercare il nome della classe e immediatamente dopo il nome della classe sostituire il vecchio serialVersionUID con il nuovo.

È documentato che la serializzazione non è destinata all'uso per dati persistenti. Per recuperare quei dati, dovrai eseguire il downgrade della versione della tua JVM alla versione utilizzata per generare tali dati.

Per riferimento futuro, non utilizzare la serializzazione per conservare i dati tra le sessioni della JVM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top