Je dois modifier une classe en ajoutant deux nouveaux paramètres. Cette classe est sérialisée avec Kryo. Je persiste actuellement les informations relatives à cette classe, entre autres, en tant que RDD, à chaque fois que j'arrête mon flux. Lorsque je redémarre le flux, je charge les informations que j'ai précédemment persistées et je les utilise pour avoir une cohérence entre le moment où j'ai arrêté et le moment où je redémarre.
Puisque la classe que je persiste a besoin de ces nouveaux paramètres, j'ai modifié la classe et le sérialiseur, en ajoutant le nouvel élément kryo.writeObject(output, object, ObjectSerializer)
et le kryo.readObject(input, classOf[Object], ObjectSerializer)
pour les nouveaux paramètres.
Maintenant, chaque fois que je redémarre mon flux, j'obtiens une exception : " Encountered unregistered class ...".
Cela semble évident, car j'essaie de désérialiser un objet qui n'est pas contenu dans les informations que j'ai conservées lorsque j'ai arrêté le flux. Si je supprime ces données et que je démarre le flux comme s'il n'avait pas été exécuté auparavant, l'exception ne se produit pas.
Existe-t-il un moyen d'éviter cette exception ? Peut-être en spécifiant des valeurs par défaut au cas où ces paramètres seraient manquants ?
Merci de votre attention
EDITAR:
J'ai trouvé quelque chose d'utile que je n'avais pas vu auparavant : Numéro Kryo 194 .
Ce type a implémenté le versioning en insérant simplement un long définissant la version du désérialiseur qu'il doit utiliser. C'est une solution simple mais, comme la société qui a écrit le code sur lequel je travaille n'a pas pensé à la compatibilité ascendante, je suppose que je vais devoir jeter par la fenêtre toutes les données qui ont été persistées avant le nouveau sérialiseur.
N'hésitez pas à me faire savoir si quelqu'un peut vous suggérer une meilleure solution.
EDIT 2 :
Cette situation pose toujours problème. J'ai essayé d'utiliser le CompatibleFieldSerializer comme décrit ici : Exemple de CompatibleFieldSerializer Ainsi, en enregistrant ce sérialiseur et non le sérialiseur personnalisé utilisé précédemment. Le résultat est que maintenant, lors du rechargement des données persistantes, il donne un java.lang.NullPointerException
. Il n'y a toujours pas de problème si aucune donnée antérieure n'a été conservée. Je peux démarrer mon flux, sérialiser les nouvelles données, arrêter le flux, désérialiser et redémarrer mon flux. Toujours pas d'indice sur la résolution.