Jérem080 Posté(e) 9 mars 2011 Share Posté(e) 9 mars 2011 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 ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
jokamax Posté(e) 11 mars 2011 Share Posté(e) 11 mars 2011 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Jérem080 Posté(e) 11 mars 2011 Auteur Share Posté(e) 11 mars 2011 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jokamax Posté(e) 11 mars 2011 Share Posté(e) 11 mars 2011 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 11 mars 2011 Share Posté(e) 11 mars 2011 Si c'est bien Gson que tu utilises, tu as la possibilité de définir ton propre déserialiseur pour ta classe : cf doc Lien vers le commentaire Partager sur d’autres sites More sharing options...
jokamax Posté(e) 11 mars 2011 Share Posté(e) 11 mars 2011 Je t'invite à regarder également point de vue performance ici : Mon lien Lien vers le commentaire Partager sur d’autres sites More sharing options...
Jérem080 Posté(e) 11 mars 2011 Auteur Share Posté(e) 11 mars 2011 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)). Lien vers le commentaire Partager sur d’autres sites More sharing options...
jokamax Posté(e) 11 mars 2011 Share Posté(e) 11 mars 2011 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Jérem080 Posté(e) 11 mars 2011 Auteur Share Posté(e) 11 mars 2011 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Jérem080 Posté(e) 11 mars 2011 Auteur Share Posté(e) 11 mars 2011 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. :( Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.