2013-04-01 2 views
4

En Smalltalk Pharo J'utilise ReferenceStream à serialise une liste d'objets - voici la définition de la classe des objets que je suis sérialisation:Smalltalk ReferenceStream a des problèmes avec les nouvelles variables d'instance?

Object subclass: #Task 
instanceVariableNames: 'title notes list project dateNextAction dateCreated dateCompleted importance selected' 
classVariableNames: 'Database' 
poolDictionaries: '' 
category: 'ToDo' 

J'utilise la méthode décrite ici SMFileDatabase: http://book.seaside.st/book/advanced/persistency/image-based-persistency

Cela a bien fonctionné, et ça a été bien de ne pas avoir à utiliser une base de données pour mon application prototype.

Howevere, voici le problème: quand j'ajoute une nouvelle variable d'instance person-Task la charge de ReferenceStream casse:

Object subclass: #Task 
instanceVariableNames: 'title notes list project person dateNextAction dateCreated dateCompleted importance selected' 
classVariableNames: 'Database' 
poolDictionaries: '' 
category: 'ToDo' 

Il semble ne pas repérer la nouvelle variable, et charger les valeurs dans les mauvaises fentes , donc personne prend la valeur de dateNextAction, dateNextAction prend dateCreated et ainsi de suite.

Comment puis-je arrêter cela?

Je l'ai fait fonctionner en plaçant la nouvelle variable à la fin de la liste, mais je voudrais regrouper les variables par type.

Répondre

6

ReferenceStream n'est plus supporté et a été supprimé dans Pharo 2.0. Vous devriez utiliser du carburant qui est bien écrit, bien documenté, bien testé et très rapide. http://rmod.lille.inria.fr/web/pier/software/Fuel

+0

... et vous pouvez également l'installer dans Pharo 1.4. Donc, c'est un gagnant-gagnant :) – EstebanLM

+0

et il suffit de lire le code pour ReferenceStream pour savoir pourquoi vous voulez utiliser le carburant :) –

6

SmartRefStream devrait vous aider. Pour citer de la documentation:

Ordinary ReferenceStreams suppose que les noms et l'ordre des variables d'instance est exactement le même lorsqu'un fichier objet est écrit et lu.
SmartRefStream permet de lire les fichiers objet même après que les variables d'instance ont changé ou que la classe entière a été renommée.

0

Ceux qui veulent terminer l'exemple dans le livre, procédez comme suit:

1. Rendez-vous dans le temps et obtenir un Pharo 1.4 de: https://gforge.inria.fr/frs/?group_id=1299

Faites défiler la liste et chercher un -Cliquez sur Pharo 1.4 et obtenez la dernière version, s'il y en a une plus récente que: https://gforge.inria.fr/frs/download.php/file/31359/Pharo-1.4-14457-OneClick.zip

Utilisez le navigateur de configuration pour installer Seaside et vous avez terminé.

1a. Ou utilisez la Mer de préconstruit de développement existant, Scriptaculous, Magritte, l'image jetée en cours d'exécution ici Pharo 1.3: http://www.seaside.st/distributions/Seaside-3.0.7-final.zip

J'ai eu la chance en utilisant une Pharo VM à partir d'ici: http://files.pharo.org/vm/pharo/20/mac/stable.zip

2. Obtenez votre code sur du image actuelle via Monticello, puis "retour" dans l'image plus ancienne. Succès!

PS. Plus de détails ici: FileDirectory and ReferenceStream Class equivalents in Pharo?

Questions connexes