web-dev-qa-db-fra.com

Est-il possible d'utiliser l'instance Gson comme champ statique dans un bean de modèle (réutilisation)?

Voici le modèle que j'ai mis en place:

public class LoginSession {
    private static final Gson gson = new Gson();

    private String id;
    private String name;
    private long timestamp;

    public LoginSession(String id, String name) {
        this.id = id;
        this.name = name;
        this.timestamp = System.currentTimeMillis();
    }

    public String toJson() {
        return gson.toJson(this);
    }

    public static LoginSession fromJson(String json) {
        checkArgument(!isNullOrEmpty(json));
        return gson.fromJson(json, LoginSession.class);
    }
}

Je pensais qu'il était inutile de créer une nouvelle instance Gson pour chaque instance LoginSession.

Mais ce qui me préoccupe, ce sont les problèmes de sécurité des threads. Environ 1000 instances/s seront créées.

Est-il possible d'utiliser l'instance Gson en tant que champ statique?

Merci pour tous conseils/corrections.

129
philipjkim

Cela me semble parfait. Il n'y a rien dans l'instance GSON qui la lie à une instance spécifique de LoginSession, elle devrait donc être statique.

Instances GSON devrait être thread-safe , et il y avait un bug concernant celui qui a été corrigé.

119
MByD

La classe de base Gson est thread-safe. Je viens de rencontrer un problème de sécurité du fil qui était censé être avec GSON. Le problème est survenu lors de l’utilisation d’une analyse JsonDeserializer personnalisée et de JsonSerializer pour Date et le formatage. Il s'est avéré que le problème de la sécurité des threads était l'utilisation par ma méthode d'une instance statique SimpleDateFormat qui n'est pas thread-safe. Une fois que j'ai enveloppé le statique SimpleDateFormat dans une instance ThreadLocal, tout s'est bien passé.

19
entpnerd

Selon les commentaires, le test unitaire existant ne teste pas beaucoup, soyez prudent avec tout ce qui concerne la sécurité du filetage ...

Il y a un test unitaire vérifiant la sécurité du fil:

/**
 * Tests for ensuring Gson thread-safety.
 *
 * @author Inderjeet Singh
 * @author Joel Leitch
 */
public class ConcurrencyTest extends TestCase {
  private Gson gson;
  ...

Vous vous demandez peut-être si ce test unitaire est suffisant pour trouver tous les problèmes possibles dans toutes les configurations de machine possibles? Des commentaires à ce sujet?

Il y a aussi cette phrase dans le docs :

L'instance Gson ne conserve aucun état lors de l'appel des opérations Json. Ainsi, vous êtes libre de réutiliser le même objet pour plusieurs opérations de sérialisation et de désérialisation Json.

8
Christophe Roussy