Jump to content

Archived

This topic is now archived and is closed to further replies.

Jérem080

Parser avec Gson dans des classes qui extends OverlayItem

Recommended Posts

Mon problème est le suivant :

Tout d'abord, j'utilise Gson pour désérialiser un flux Json et ainsi obtenir une liste avec tous mes objets créés (attributs du style : lat, lon, détail, ville, etc).

Tout se passe pour le mieux. Le problème est que ma classe EXTENDS OverlayItem (pour pouvoir être afficher sur une carte GoogleMaps) et doit donc appeler la méthode SUPER dans le constructeur avec un GeoPoint. Hors le flux Json est parser en passant par un constructeur sans argument. Ce qui ne m'arrange pas car sans GeoPoint, pas possible d'afficher les objets sur ma carte.

La seule solution que j'ai trouvé c'est de boucler sur ma liste d'objet et à chaque fois recréer un objet en lui passant dans le constructeur la latitude et la longitude pour le GeoPoint et faire une recopie de tous les attributs. Mais la performance n'y est pas. 45min d'attente :(

Quelqu'un aurait-il une solution à mon problème ?

Share this post


Link to post
Share on other sites

Bonjour,

J'avoue que le problème n'est pas clair.

Quelle est la classe qui étant overlayItem ? La classe de dé-sérialisation ?

Tu veux désérialiser la liste d'objet avant puis créer les overLayItem + geopoint correspondant ?

Ou

Tu veux désérialiser au fur et a mesure, pour chaque objet obtenu créer un overLayItem + geopoint ?

Ce que je ferais :

La classe de désérialisation n'étant rien mais possède une List<OverLayItem>.

Tes objets possède une méthode getGeopoint, qui renvoie un new GeoPoint(lat, long);

(si je me trompe pas pas de problème avec la désérialisation vue que ce n'est qu'une méthode ... mais je peux me tromper)

Chaque fois qu'un objet est désérilisé :

List<OverlayItem>.add(new OverLayItem(myObj.getGeopoint(), myObj.getInfo, ...)

Ou

Ta classe de désérialisation n'étant rien.

Tes objets étendent overLayItem avec tes champs en plus.

Tu redéfinis le constructeur qui auto appel un GeoPoint interne créé avec lat/long

Désolé c'est du pseudo code et je suis peut être à coté ^^ je me suis levé tot ^^

Jok

Share this post


Link to post
Share on other sites

Merci Jok de réfléchir à mon prolème,

En fait j'ai bien comme tu a dis dans ton 2ème cas : Une classe avec une liste d' "OverlaysItem" et une classe "Objet" qui étend "OverlayItem" avec mes quelques attributs persos.

Le problème est que lorsque j'effectue un "Gson.fromJson" d'un flux Json venant de mon service Rest, Gson va bien me remplir ma liste d'objet mais il ne passe pas dans mon constructeur avec mes 2 arguments (lat , lon) pour ensuite faire un SUPER(new GeoPoint(lat, lon)). Il passe par mon constructeur par defaut sans argument (Ce qui est normal car il passe par le constructeur avant de garnir mon objet avec les attributs lat et lon).

D'où le problème. Je suis alors obligé de reparcourir ma liste en créant pour chaque objet un nouvel objet et passant lat et lon en paramètre pour créer mes objet qui seront dès lors opérationnel pour pouvoir être afficher sur la carte (vu qu'ils auront un GeoPoint).

J'aimerais donc trouver une solution pour ne pas reparcourir tous les éléments et bien les reconstruire.

PS : Il n'y a pas de fonction "setGeoPoint" et Gson ne passe pas par un constructeur avec argument : mes 2 pistes qui posent problème et qui m’empêche de fournir du bon code..

Merci

Share this post


Link to post
Share on other sites

PS : Il n'y a pas de fonction "setGeoPoint" et Gson ne passe pas par un constructeur avec argument : mes 2 pistes qui posent problème et qui m’empêche de fournir du bon code..

Puisque tu étends OverLayItem : rien ne t’empêche de rajouter une méthode setGeopoint à ton objet qui fait this.mPoint = newGeopoint(x,y) à ton objet non ?

Sinon faire l'inverse : étendre geoPoint et dès qu'un objet est récupérer faire toi même le new overlayItem sur ce geopoint

Courage,

Jok

Share this post


Link to post
Share on other sites

Si c'est bien Gson que tu utilises, tu as la possibilité de définir ton propre déserialiseur pour ta classe : cf doc

Share this post


Link to post
Share on other sites

Puisque tu étends OverLayItem : rien ne t’empêche de rajouter une méthode setGeopoint à ton objet qui fait this.mPoint = newGeopoint(x,y) à ton objet non ?

J'ai déjà essayé mais il ne veut pas qu'on affecte un GeoPoint à la variable mPoint. Seulement au niveau du SUPER(new GeoPoint(x,y)).

Share this post


Link to post
Share on other sites

Solution vicieuse mais toute simple :

- Ton objet n'étend plus overlayitem mais ta classe possède une méthode propre getOverLayitem() qui fait le new overlayitem des paramètres, à appelé juste aprés chaque serialisation.

Solution classe :

- Mon collègue à raison tu peux ecrire un fragment de désérialiseur qui te fera ton new avec paramètre quand il a désérialisé le nécessaire.

Jok

Share this post


Link to post
Share on other sites

Solution vicieuse mais toute simple :

- Ton objet n'étend plus overlayitem mais ta classe possède une méthode propre getOverLayitem() qui fait le new overlayitem des paramètres, à appelé juste aprés chaque serialisation.

Solution classe :

- Mon collègue à raison tu peux ecrire un fragment de désérialiseur qui te fera ton new avec paramètre quand il a désérialisé le nécessaire.

Jok

Le seul prob pour ta solution vicieuse :) c'est que je dé-sérialise une liste d'objet automatiquement et que faire à chaque fois un NEW pour chaque objet revient au même. Point de vue performance je recrée moi même un nouvel objet à chaque fois et sur le mobile si j'en ai 200 c'est pas supportable.

Je vais tester la deuxième méthode :)

Merci

Share this post


Link to post
Share on other sites

Je ne trouve pas le moyen de dire à ma classe qui étend JsonDeserializer de mettre en argument les 2 attributs qui s'attend à recevoir par le flux JSON.

:(

Share this post


Link to post
Share on other sites





×
×
  • Create New...