Ich habe Code geerbt, der unseren Anwendungsstatus als JSON mit Gson speichert, und liest ihn dann mit fromJson.RuntimeException in Gson beim Parsen von JSON: Fehler beim Aufrufen von protected java.lang.ClassLoader() ohne Argumente
Gson gson = createGson();
gson.fromJson(objString, myClass);
Eines der Felder, die gespeichert werden, ist Location. Leider sehr gelegentlich das Parsen, dass die gespeicherten Daten nicht, weil mein gespeicherten Standort eine mClassLoader in seiner mExtras enthält und die Gson Bibliothek nicht die Classloader mit diesem Fehler zu erstellen:
RuntimeException: Failed to invoke protected java.lang.ClassLoader() with no args
Weiß jemand, warum ein Classloader zu sein, ist in den Extras für meinen Standort enthalten, und ob es in der JSON-Darstellung enden sollte?
Ich gehe davon aus, dass ich das beheben kann, indem ich die Schlüsselfelder aus dem Location-Objekt einzeln speichere (z. B. Längengrad, Breitengrad, Höhe, Zeit, Genauigkeit), aber es wäre nett, wenn möglich das Location-Objekt zu speichern.
Ich sah dort ein ExclusionStrategy Objekt I Felder auszuschließen verwenden könnte, aber ich war nicht sicher, ob ich das verwenden könnte/sollte die Extras aus meinem Ort auszuschließen ...
FYI, ist hier die JSON-Daten für mein Standortobjekt (mit der Länge und Breite verändern mich zu verstecken):
{
<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>
}
Hier ist ein Beispiel, was die mExtras enthält, wenn der Code nicht abstürzt:
"mExtras": {
"mParcelledData": {
"mOwnsNativeParcelObject": true,
"mNativePtr": 1544474480
},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
}
Schöne Antwort, danke. Ich dachte, ich hätte überprüft, ob das Location-Objekt Serializable implementiert, aber es stellt sich heraus, dass es nicht funktioniert - es ist also keine Überraschung, dass unser Code kaputt war! –
Jetzt getestet und die Reparatur funktioniert super. Durch das Speichern der Feldnamen mit den gleichen Namen, die das System verwendet hat ("mProvider", "mAccuracy" usw.), ist es wieder kompatibel mit alten Anwendungsdaten, die das mClassLoader-Extra enthalten, das eine Ausnahme ausgelöst hat. –
Ehrfürchtig. Froh, dass ich helfen konnte. –