11
votes

Existe-t-il une solution sur le "référence circulaire" du GSON?

J'ai trouvé de nombreux articles sur la référence circulaire avec GSON, mais je ne trouve pas de solution élégante.

Comme je le sais, certaines solutions sont les suivantes:

  • Définissez la propriété qui a provoqué une référence circulaire comme "transitoire".
  • exclure la propriété avec une annotation.

    Mais en tant que question générale, existe-t-il une stratégie commune pour résoudre le problème?


4 commentaires

Un jeu étrange, le seul moyen de gagner est de ne pas jouer. Répartition pour ne pas avoir de références circulaires.


La préoccupation est-elle juste avec la sérialisation ou est-elle également en établissant les liens corrects lors de la désérialisation?


Oui il y a! Jetez un coup d'œil à ce message qui inclut un [exemple graphradapterbuilder] [1] [1]: Stackoverflow.com/questions/10036958/...


Oui: Stackoverflow.com/a/22271096/3315914


3 Réponses :


3
votes

Autant que je sache, il n'y a pas de solution automatisée pour les références circulaires dans GSON. La seule bibliothèque productrice de JSON que je connaisse de cette poignée Les références circulaires sont automatiquement Xstream (avec backend Jettison).

Edit: Jackson prend également en charge la manipulation de références circulaires avec @jsonidityInfo Annotation; Donc, bien que ce ne soit pas automatique (vous devez marquer des références nécessitant une manipulation d'un identifiant d'objet), il permet de résoudre la plupart des cas.


3 commentaires

Correct, GSON n'a pas de solution automatique pour les références circulaires, ni une solution de sérialisation autre que Marquant des champs Java à ignorer et / ou à écrire un code de sérialisation personnalisé. Sinon, Jackson fournit une solution à base d'annotation pour les préoccupations de sérialisation et de désérialisation. Voir point n ° 7 à CowTownCoder.com/blog/archives/2010/11 /enterry_434.html


Merci, j'ai résolu le problème en excluant les champs indirectement. Et je vais étudier Xstream quand j'ai du temps libre.


Plus un pour Xstream. La seule solution viable que j'ai trouvée qui semble fonctionner.



-1
votes

Depuis que GSON ne gère pas correctement les références circulaires et, dans certains cas, vous devrez peut-être appeler l'entité mère de son enfant, vous pouvez le faire. Disons que nous avons:

//Assuming a List<PostgresTable>...
postgresTables.forEach(postgresTable -> postgresTable.getServer().setTables(null));


0 commentaires

-2
votes

Je regarde aussi ce problème aussi. GSON ne fournit pas une solution par défaut jusqu'à présent. Ce que vous pouvez faire est:

Option 1: Créez une stratégie d'exclusion qui implémente Exclusionstrategy pour exclure la classe et / ou le champ dans la référence circulaire;

Option 2: Utilisez des annotations pour marquer le champ pour être transitoire pour éviter la sérialisation;

Option 3: Créez votre propre adaptateur de type


0 commentaires