Ventury Networks’ Blog

“If it walks like a duck and quacks like a duck, I would call it a duck.”

Binary Object Stream Service


VisualWorks propose un Parcel nommé BOSS, pour Binary Object Stream Service. Celui ci permet le stockage d’instances sous la forme d’un fichier binaire. Ce parcel est normalement chargé dans l’image de départ de VW 7.5, mais le cas échéant, il peut être chargé via le parcel manager (”System” -> “Parcel Manager”). Il se trouve dans l’onglet suggestion, et le dossier “Application Developpement”.

Le code suivant permet d’utiliser BOSS :

myWriteStream := 'monFichier.dat' asFilename writeStream.
bos := BinaryObjectStorage onNew: myWriteStream.
"on suppose qu'il existe anObject, une instance de classe quelconque..."
[bos nexPut: anObject] ensure: [bos close].

On pourrait tout aussi bien utiliser le message “nextPutAll: aCollection” pour stocker un ensemble d’instances. La construction [aBlockClosure] ensure: [anAction] retourne la valeur retournée par le premier block, mais, avant cela, évalue le second bloc.

Pour récupérer des instances d’objets, le problème n’est pas plus compliqué :

myReadStream := 'monFichier.dat' asFilename readStream.
bos := BinaryObjectStorage onOldNoScan: myReadStream.
[myObjects := bos contents] ensure: [bos close].

Il est également possible de stocker des définitions de classes, avec le message “nextPutClasses: anArray” (anArray doit contenir les classes à enregistrer). Pour les récupérer depuis la sauvegarde, le message nextClasses fera l’affaire ;-)

BOSS est capable de détecter les changements dans la définition des classes lors du chargement d’instances depuis un fichier BOSS. Ainsi, vous pouvez diffuser un patch contenant les nouvelles classes oou les modifications apportées à votre logiciel, tout en assurant la rétro-compatibilité des sauvegardes des utilisateurs. Il suffit pour cela de définir deux méthodes dans la nouvelle version de la classe : une méthode d’instance nommée “binaryRpresentationVersion”, qui retourne la version de la classe (1, 2, 3… etc), et une méthode “binaryReaderBlockForVersion: oldVersion format: oldFormat” qui se charge de convertir l’anciene instance objet sous sa nouvelle forme. Le reste est fait automatiquement par BOSS.

BOSS est largement décrit dans le guide du développeur d’applications VisualWorks (AppDevGuide.pdf) situé dans le repertoire “doc” de votre installation VisualWorks. Ce billet en est d’ailleurs largement inspiré.

Avec un tel outils, imaginez la quantité de difficultés levées lors du developpement d’applications : sauvegarde aisée des éléments produits par l’applications, et mise à jour facile … Un bonheur.

Je crois (mais je n’en suis pas certain) qu’il est possible d’utiliser BOSS sur autre chose qu’un Stream sur un fichier. Une connexion TCP par exemple ? Je vérifierais, mais je n’ai pas encore en tête “l’application qui tue” d’une telle possibillité. Si vous avez des idées …

Tags :