Force GSON à l'utilisation spécifique du constructeur
public class UserAction {
private final UUID uuid;
private String userId;
/* more fields, setters and getters here */
public UserAction(){
this.uuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
}
public UserAction(UUID uuid){
this.uuid = uuid;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final UserAction other = (UserAction) obj;
if (this.uuid != other.uuid && (this.uuid == null || !this.uuid.equals(other.uuid))) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 7;
hash = 53 * hash + (this.uuid != null ? this.uuid.hashCode() : 0);
return hash;
}
}
Je suis à l'aide de Gson à serilize et désérialiser cette classe. Comme aujourd'hui, j'ai dû ajouter un final UUID dans cet objet. Je n'ai pas de problème de sérialisation. J'ai besoin de force gson à utiliser public UserAction(UUID uuid)
constructeur lors de la désérialisation. Comment puis-je y parvenir ?
OriginalL'auteur frail | 2011-05-31
Vous devez vous connecter pour publier un commentaire.
Vous pourriez mettre en œuvre une coutume JsonDeserializer et l'enregistrer avec GSON.
Garder à l'esprit que ce code n'a pas été testé.
OriginalL'auteur Tomasz Błachowicz
Une autre approche pour résoudre ce problème serait de profiter du fait que lors de la désérialisation Gson va tabasser les valeurs définies par les constructeurs avec de nouvelles valeurs que l'on retrouve dans le JSON, et juste utiliser un InstanceCreator, qui existe spécifiquement "pour créer des instances d'une classe qui ne définit pas un no-args constructeur". Cette approche fonctionne particulièrement bien lorsque le constructeur pour être utilisé attribue des valeurs de paramètre pour les champs, et n'effectue pas de vérification de la validité ou exécutent de toute significatifs de l'état de traitement.
Aussi, cette approche ne nécessite pas de nouvelles de la désérialisation -- non personnalisé de mise en œuvre de
JsonDeserializer
est nécessaire. Cela peut être avantageux pour les situations où l'introduction d'un personnalisé deserializer pour résoudre un petit problème nécessite alors "manuel", le traitement des autres JSON éléments à proximité, ce qui pourrait être non négligeable.Cela dit, voici une solution qui utilise le préféré
UserAction
constructeur, mais il passe seulement une référence nulle. La valeur réelle de l'JSON est plus tard. (Gson ne se soucie pas que lauuid
champ est censé être final.)OriginalL'auteur Programmer Bruce
OriginalL'auteur dupdup