Ho ereditato un codice che consente di risparmiare il nostro stato di applicazione come JSON utilizzando GSON, e poi lo legge con fromJson.RuntimeException in GSON analisi JSON: Impossibile richiamare protetto java.lang.Classloader() senza args
Gson gson = createGson();
gson.fromJson(objString, myClass);
Uno dei campi salvati è uno Location. Purtroppo, molto raramente l'analisi di quei dati salvati non riesce perché la mia posizione salvata include una mClassLoader nelle sue mExtras, e la biblioteca GSON non riesce a creare il ClassLoader con questo errore:
RuntimeException: Failed to invoke protected java.lang.ClassLoader() with no args
Qualcuno sa perché un ClassLoader è essere incluso negli extra per la mia posizione e se dovrebbe finire nella rappresentazione JSON?
Suppongo di poter risolvere questo problema semplicemente salvando i campi chiave dall'oggetto Posizione singolarmente (ad esempio longitudine, latitudine, altitudine, tempo, precisione), ma sarebbe bello salvare l'oggetto Posizione, se possibile.
ho visto c'è un oggetto ExclusionStrategy ho potuto utilizzare per escludere i campi, ma non ero sicuro se potrebbe/dovrebbe utilizzare che per escludere i gli extra da dentro la mia posizione ...
Cordiali saluti, ecco i dati JSON per il mio oggetto Location (con la longitudine e la latitudine modificati per nascondere me):
{
<snip>
"lastKnownLocation": {
"mResults": [
0,
0
],
"mProvider": "gps",
"mExtras": {
"mParcelledData": {
"mOwnObject": 1,
"mObject": 5525040
},
"mClassLoader": {
"packages": {}
},
"mMap": {},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
},
"mDistance": 0,
"mTime": 1354658984849,
"mAltitude": 5.199999809265137,
"mLongitude": -122.4376,
"mLon2": 0,
"mLon1": 0,
"mLatitude": 37.7577,
"mLat1": 0,
"mLat2": 0,
"mInitialBearing": 0,
"mHasSpeed": true,
"mHasBearing": false,
"mHasAltitude": true,
"mHasAccuracy": true,
"mAccuracy": 16,
"mSpeed": 0,
"mBearing": 0
},
<snip>
}
Ecco un esempio ciò che il mExtras contiene quando il codice non va in crash:
"mExtras": {
"mParcelledData": {
"mOwnsNativeParcelObject": true,
"mNativePtr": 1544474480
},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
}
Bella risposta, grazie. Pensavo di aver verificato che Serializable implementasse l'oggetto Location, ma non è così, quindi non sorprende che il nostro codice sia stato violato! –
Ora testato e la soluzione funziona alla grande. Salvando i nomi dei campi con gli stessi nomi utilizzati dal sistema ("mProvider", "mAccuracy" ecc.) È compatibile con i vecchi dati dell'applicazione contenenti l'extra mClassLoader utilizzato per generare un'eccezione. –
Fantastico. Sono contento di poterti aiutare. –