2008-09-16 10 views
6

Est-ce que quelqu'un a rencontré des problèmes de sérialisation des composants dans un fichier et de les relire, en particulier dans la zone où le fournisseur du composant met à niveau les composants VCL. Par exemple, un fichier sérialisé avec DelphiX, puis des années plus tard relire avec delphiY. Les formats de sérialisation changent-ils et si oui, que peut-on faire pour éviter les erreurs de lecture dans les composants lors de la mise à niveau?Sérialisation des composants Delphi

Répondre

3

Le système RTTI intégré pour la sérialisation des propriétés publiées est vulnérable aux modifications des composants. Aller de l'avant est gérable tant que les anciennes propriétés sont conservées dans de nouveaux objets. C'est à dire. vous laissez l'interface de la propriété telle quelle, mais pouvez jeter le contenu si vous le souhaitez. Revenir en arrière est pire, car une nouvelle version de la propriété enregistrée ne peut pas être ouverte dans une ancienne version, ce qui pose problème.

Il existe des composants/libs (http://www.torry.net/quicksearchd.php?String=RTTI&Title=Yes) qui peuvent ajouter une sérialisation au format XML, ce qui peut vous aider un peu car vous pouvez ignorer le contenu que vous ne connaissez pas.

Vous devez toujours être attentif à la façon dont vous concevez votre contenu publié et devriez probablement trouver un moyen de "ignorer mais propager" le contenu que votre version actuelle ne comprend pas. Cela vous permettra d'ouvrir et de modifier un fichier dans un format plus récent tout en essayant de conserver les nouveaux attributs, au lieu de les supprimer.

+0

En utilisant la diffusion en continu VCL, vous pouvez gérer les propriétés manquantes (ainsi que les classes manquantes et autres erreurs) lorsque vous utilisez directement Classes.TReader et que vous écrivez un gestionnaire pour l'événement OnError. Vous avez trouvé tout le code nécessaire dans l'unité Classes. Le plus grand inconvénient est que votre classe/classes doit être dérivé de TComponent ou au moins de TPersistent. –

0

Les formats vont définitivement changer, car les fournisseurs ajouteront des fonctionnalités à leurs composants. La sérialisation boucle simplement toutes les propriétés publiées et les enregistre dans un flux. Lors de leur relecture, chacune des propriétés lues dans le flux sera redéfinie sur le composant. Si la propriété n'existe plus, vous avez un problème. Je ne pense pas que vous pouvez faire quelque chose à ce sujet en plus de la gestion des exceptions de base.

La meilleure façon de garantir la compatibilité est de faire votre propre sérialisation.

0

Merci pour la réponse. J'essayais d'éviter la sérialisation personnalisée et de tirer parti de la technique de sérialisation de chaque composant, mais avec le manque de possibilité de "patcher" une mise à niveau vers un nouveau format de composant, je suppose que la sérialisation personnalisée est la seule méthode.

+0

Vous pouvez créer de nouvelles versions capables de lire les anciens flux tant que vous avez toujours pris en charge la lecture des paramètres anciens et obsolètes. Le problème consiste à faire en sorte que les anciennes versions lisent de nouveaux flux qui ne peuvent pas être effectués sans sérialisation personnalisée. –

Questions connexes