9
votes

Comment puis-je désérialiser les anciennes données pour un type qui a changé?

J'ai des données stockées à l'aide de sérialisement binaire pour la classe suivante: xxx

à un moment donné, la classe a été remplacée par ceci: xxx

Ceci fait des problèmes de désérialisant les anciennes données.

Ma première pensée était de mettre en œuvre iserialisable , mais cette classe a de nombreuses propriétés ainsi que des centaines de classes héritantes que je devrait-en mettre en œuvre cela aussi.

Je voudrais modifier les anciennes données pour faire correspondre la structure actuelle pendant la désérialisation ou avoir un moyen propre de la mise à niveau des anciennes données.


0 commentaires

4 Réponses :


3
votes

Si les données sont utilisées uniquement en interne, ma première pensée consisterait à écrire un code jeton simple pour désémarrer vos données binaires à l'aide de l'ancienne "NomValuecollection", carapotiez-la à un dictionnaire et de la rééparatialiser. Même si cela prendra quelques jours pour traiter toutes les données, il ne semble pas la peine d'implémenter un correctif sur votre nouveau code pour prendre en charge les anciennes données.

Même s'il est non seulement utilisé en interne, un importateur semble être le moyen le plus simple d'aller.


0 commentaires

2
votes

Ajout de bons conseils d'Olivierd, je vous suggère de définir les deux classes, mais essayez initialement de désérialiser comme version actuelle. Dans votre bloc de capture, désérialisez-le comme la version héritée, puis mettez-la à l'actuelle et sauvegardez-la. Lorsqu'il n'y a pas d'instances de la version héritée, vous pouvez supprimer le code.


0 commentaires

5
votes

ajoutez le nouveau _ fielderrors sous un nom différent, dites _fielderrors2 et faites-le [Facultatif] . Ensuite, implémentez un [ondeserialized] méthode qui copie les données de _fielderrors à _fielderrors2 (si présent) et efface _fielderRors.


1 commentaires

Cela a fourni l'approche la plus réaliste de mes besoins, mais j'ai fini par descendre d'une route différente.



0
votes

Après avoir enquêté sur quelques options, j'ai formulé les conclusions suivantes:

Idéalement, je serais en mesure d'accéder à la valeur à partir de l'original NomValuecollection et de la convertir manuellement en Dictionnaire . Le seul moyen de faire cela serait de mettre en œuvre iserialisable , mais cela a posé deux problèmes majeurs: correspondant à la nommage des données héritées et à l'inclusion de la logique de sérialisation pour toutes les classes héritantes (dont il y a des centaines).

efficacement, cela me met dans une liaison. Heureusement, j'ai pu déterminer que ce champ est réellement utilisé uniquement comme résumé des erreurs de validation des formulaires et ne devrait pas être sérialisé en premier lieu, je l'ai donc exclu de la sérialisation.


0 commentaires