2013-05-25 2 views
4

J'ai des objets polymorphes dans un projet. J'ai aussi un webservice qui nécessite des objets dans JSON. Je souhaite stocker les objets à envoyer dans une carte pour les avoir ensuite sérialisés avec Jackson. Le seul ancêtre commun de ces objets est l'objet java. J'ai annoté certains des objets pour inclure des informations de type en tant que propriété. Donc je crée les objets, je les stocke dans une carte, je les passe à une fonction qui sérialise la totalité de la collection et j'envoie la chaîne sérialisée à un webservice. Assez simple, mais comme le souligne the jackson wiki, les informations de type sont perdues en raison de java type-effacement. Mon idée est alors de pré-sérialiser des objets réels dans la collection (quand leur type réel est connu), et de le stocker dans la collection pour avoir toute la collection sérialisée plus tard, en utilisant ces chaînes préserialisées. Est-ce que c'est en quelque sorte possible? Ou existe-t-il une solution de contournement qui n'exige pas que les types réels soient connus lors de la sérialisation?Jackson sérialisation de collection polymorphe en plusieurs étapes pour éviter l'effacement de type

+0

Avez-vous lu à propos de 'Externalizable' qui vous permettra d'ovverider les méthodes sérialiser, à partir de là vous pouvez mettre quelques informations sur la classe pour récupérer la classe correctement. – greedybuddha

+0

Une idée sur comment l'utiliser avec jackson? – azyoot

+0

Malheureusement non, normalement vous implémentez simplement Externalizable, mais avec Jackson qui pourrait ne pas fonctionner – greedybuddha

Répondre

0

Qu'à cela ne tienne, j'ai créé un sérialiseur personnalisé et un type personnalisé:

@JsonSerialize(using = PreserializedMapSerializer.class) 
class PreserializedMap extends HashMap<String,String>{ 
} 

Et PreSerialize les objets:

PreserializedMap map = new PreserializedMap(); 
... 
map.put("device",objectMapper.writeValueAsString(device)); 

sérialiser Puis la collection:

objectMapper.writeValueAsString(map); 

Le sérialiseur est:

public static class PreserializedMapSerializer extends JsonSerializer<PreserializedMap>   { 

    @Override 
    public void serialize(PreserializedMap value, JsonGenerator generator, 
     SerializerProvider provider) throws IOException, 
      JsonProcessingException { 

     generator.writeStartObject(); 
     for(Entry<String,String> entry : value.entrySet()){ 
      generator.writeObjectFieldStart(entry.getKey()); 
      generator.writeRaw(entry.getValue().substring(1, entry.getValue().length()-1)); 
      generator.writeEndObject(); 
     } 
     generator.writeEndObject(); 

    } 

} 
Questions connexes