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
Q
Jackson sérialisation de collection polymorphe en plusieurs étapes pour éviter l'effacement de type
4
A
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
- 1. Sérialisation polymorphe des collections avec Custom Serializer dans jackson
- 2. boost :: initialisation de type polymorphe de sérialisation
- 3. Jackson: sérialisation collection personnalisée à JSON
- 4. Désérialisation polymorphe de Jackson avec types dynamiques
- 5. Sérialisation Json.Net de type avec objet enfant polymorphe
- 6. Sérialisation énumérations avec Jackson
- 7. (+ jackson) Champ carte sérialisation
- 8. Jackson Json sérialisation
- 9. Éviter l'exécution de plusieurs Garbage Collection
- 10. Guava Sérialisation en option avec Jackson
- 11. Jackson - objets de date de sérialisation
- 12. Jackson question sérialisation avec CommonsMultipartFile
- 13. Sérialisation XML pour les types de collection
- 14. Jackson Yaml type info est erroné sur sérialisation
- 15. Désérialisation polymorphe de Jackson avec propriété de type imbriquée dans l'objet
- 16. Jackson - sérialisation des entités hibernate
- 17. Jackson ne sérialisation Joda DateTimeFormatter
- 18. Les champs de sérialisation de Jackson sont-ils en majuscules?
- 19. Jackson :: ajout de champs supplémentaires à un objet en sérialisation
- 20. Jackson 2.1.2 La désérialisation polymorphe déclenche JsonMappingException. Pourquoi?
- 21. enregistrement en plusieurs étapes
- 22. forme en plusieurs étapes
- 23. Jackson: désérialisation à une collection
- 24. Spring MVC + Jackson: sérialisation Json dynamique
- 25. Sérialisation des réponses dans Jersey + Jackson
- 26. Afficher la fonction pour le type polymorphe
- 27. Comment écraser des informations de type lors de la sérialisation d'objets avec jackson?
- 28. Sérialisation d'objets primitifs racine avec Jackson
- 29. Stratégies de formulaires en plusieurs étapes
- 30. Conseils de déploiement en plusieurs étapes?
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
Une idée sur comment l'utiliser avec jackson? – azyoot
Malheureusement non, normalement vous implémentez simplement Externalizable, mais avec Jackson qui pourrait ne pas fonctionner – greedybuddha