RuntimeException dans Gson parsing JSON: impossible d'appeler protégé java.lang.Chargeur de classe() sans arguments
J'ai hérité un peu de code qui enregistre notre état de l'application de JSON à l'aide de Gson, et puis le lit à l'aide fromJson.
Gson gson = createGson();
gson.fromJson(objString, myClass);
L'un des champs d'être sauvé est un Emplacement. Malheureusement, très occasionnellement, l'analyse de données enregistrées échoue parce que mon Emplacement d'enregistrement comprend un mClassLoader dans son mExtras, et la Gson bibliothèque ne parvient pas à créer le chargeur de classe avec cette erreur:
RuntimeException: impossible d'appeler protégé java.lang.Chargeur de classe() sans arguments
Quelqu'un sait pourquoi un chargeur de classe est incluse dans les extras pour mon Emplacement, et si elle devrait être de se retrouver dans la représentation JSON?
Je suppose que je peux résoudre ce problème en vient de sauver de la clé des champs à partir de l'Emplacement de l'objet individuellement (par exemple, la longitude, la latitude, l'altitude, le temps, précision), mais il serait agréable de les enregistrer à l'Emplacement de l'objet, si possible.
J'ai vu il y a un ExclusionStrategy objet que je pourrais utiliser pour exclure des domaines, mais je ne savais pas si je pourrait/devrait l'utiliser pour exclure les extras de l'intérieur de mon Emplacement...
Pour info, voici les données JSON pour mon Emplacement de l'objet (avec la latitude et la longitude changé de me cacher):
{
<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>
}
Voici un exemple de ce que l'mExtras contient lorsque le code ne plante pas:
"mExtras": {
"mParcelledData": {
"mOwnsNativeParcelObject": true,
"mNativePtr": 1544474480
},
"mHasFds": false,
"mFdsKnown": true,
"mAllowFds": true
}
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous êtes en essayant de tout droit de convertir un fourni par le système de classe (
Location
) en JSON. Et, comme vous le voyez vous rencontrez des problèmes avec la sérialisation de l'état interne /Java choses spécifiques. JSON est un semi-génériques moyen de transmettre des informations autour de.Vous ne pouvez pas utiliser la
@Expose
annotation facilement car il n'est pas de votre classe; qui nécessiterait de modifier le code source pourLocation
ou par l'intermédiaire d'un assez vaste processus d'ajout en cours d'exécution à l'aide de jassist (voir: http://ayoubelabbassi.blogspot.com/2011/01/how-to-add-annotations-at-runtime-to.html)À la recherche à la
Location
classe, je serais tout simplement de créer un personnalisé Gson Sérialiseur et Deserializer et être fait avec elle. Ce que vous êtes réellement intéressé par les données de GPS, pas l'intérieur de la classe elle-même. Vous venez de construire le JSON contenant les informations dont vous avez besoin dans le sérialiseur en utilisant les getters, puis dans le Deserializer vous créez une nouvelle instance deLocation
et le remplir avec les informations à partir du JSON à l'aide de la public setters.Maintenant dans votre code que vous utilisez
GsonBuilder
et enregistrer les classes:Qui devrait très bien prendre soin d'elle.
Envisager de créer un Objet personnalisé que les modèles de votre GSON, en analysant le contenu de l'Objet par Objet et champ par champ
quelque chose comme
De sorte que vous pouvez obtenir le contrôle total de l'analyse, et l'ajout d'un essai\bloc catch dans la critique mExtra partie, vous pouvez exclure le bloc, ou de gérer l'exception que vous le voulez, facilement.