Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

Silverlight : Isolated Storage et stockage des préférences utilisateur

[new:1/6/2010]L’Isolated Storage (ou stockage isolé) est une zone réservée à une application Silverlight sur la machine cliente. Les quotas sont réglés par l’utilisateur ou peuvent être modifiés par l’application sous réserve d’acceptation par l’utilisateur. Cette zone est particulièrement bien adaptée au stockage des préférences de l’application ou de l’utilisateur. Malgré les apparences, au moins dans ce cadre, la manipulation de l’Isolated Storage est enfantine…

Démonstration

[silverlight:source=/SLSamples/SLIS/SLISDemo.xap;width=400;height=250]

Une fois les informations saisies (votre prénom, le choix d'une couleur) cliquez sur le bouton de sauvegarde. Cliquez sur le bouton de lecture pour vérifier l'enregistrement. Faites un copier de l'adresse dans votre browser, fermez le. Rouvrez-le, coller l'adresse (c'est juste pour vous faire gagner du temps, vous pouvez aussi naviguer normalement vers ce billet). Comme vous le constaterez les valeurs que vous avez choisies sont reprises automatiquement par l'application ... Un peu comme un cookie mais en beaucoup plus puissant.

Stockage isolé ?

La zone de stockage est dite isolée dans le sens où elle est placée dans un endroit assez peu accessible sur la machine utilisateur (Mac ou PC) et qu’elle est directement reliée à une application Silverlight et pas une autre et qu’enfin la taille occupée par cette zone est elle-même contrainte par une gestion de quotas sous la responsabilité de l’utilisateur.

Mais pas un coffre-fort !

A noter toutefois que l’IS n’est pas “inaccessible”, il est dur à trouver, c’est tout. Il n’est pas crypté non plus. Cela signifie qu’il ne faut JAMAIS y stocker des informations sensibles de type mots de passe, cartes de crédit, etc… En tout cas pas de base. Votre application peut (et doit dans ces cas précis) utiliser le service de cryptographie .NET pour rendre les informations inviolables et infalsifiable (les deux aspects étant différents, mais c’est bon de le rappeler).

Les quotas

Limité par défaut à 1 Mo dans les premières versions, il semble désormais que 25 Mo soit attribués de base aux applications, ce qui est plus conformable.

Il n’y a rien à faire de spécial pour bénéficier de l’espace attribué par défaut, mais si on doit stocker des quantités importantes de données il est nécessaire de vérifier la place dont on dispose, voire de demande l’augmentation du quota attribué à l’application (ce qui doit être validé par l’utilisateur).

Comme un disque privé

L’IS se comporte comme un disque privé pour l’application. On peut y créer des répertoires, lire et écrire des fichiers de tout type, etc.

image

 

Le schéma ci-dessus représente un Isolated Storage dans lequel sont exploités différents objets, une collection pour les préférences utilisateurs, un répertoire pour des images (avec une image stockée). Il s’agit donc bien d’une sorte de disque dur privé pouvant stocker des données de tout type. On pourrait même y stocker une petite base de données. En tout cas on peut y placer des informations qui sont sensées être là lors de la prochaine exécution.

Attention là aussi : autant l’IS n’est pas crypté par défaut et ne doit pas servir pour stocker des données sensibles, autant il n’est pas question non plus d’y stocker des données stratégiques qui n’existeraient nulle part ailleurs ! En effet, rien ne garantit que l’utilisateur n’aura pas, même pas erreur de manipulation, effacé l’espace attribué à l’application… Si l’application doit stocker des données à durée de vie “longue” ou ayant une importance pour l’utilisateur, il est préférable d’utiliser la manipulation de fichiers traditionnels qui seront stockés dans des espaces personnels de l’utilisateurs qui eux sont sauvegardés par les backups de façon plus certaine (et que l’utilisateur peut facilement dupliquer ou copier car ces espaces sont faciles d’accès à la différence de l’IS).

Pour les curieux, l’IS place ses fichiers dans des répertoires “profonds” mais tout dépend de l’OS hôte. Par exemple sous Vista ou 7 il s’agit de : <SYSDRIVE>\Users\<user>\AppData\LocalLow\Microsoft\Silverlight\is
Alors que sous XP la racine se trouve là :
<SYSDRIVE>\Document and Settings\<user>\Local Setting\Application data\Microsoft\Silverlight\is
Pour les utilisateurs Mac, le stockage est effectué à cet endroit :
/Users/<user>/Library/Application Support/Microsoft/Silverlight/is

Les bonnes pratiques

Voici quelques conseils quand il s’agit de gérer ‘proprement’ l’IS :

  • Placer tous les appels à l’IS dans des blocs Try/Catch car pour de nombreuses raisons l’IS peut lever des exceptions (quotas dépassés, droits insuffisants…)
  • Si plusieurs applications doivent partager un même espace de stockage, l’IS n’est pas fait pour cela, l’espace disque en question doit être géré sur un serveur.
  • S’il est possible de créer des répertoires dans l’IS, rappelez-vous que sa “racine” est déjà très profonde dans l’arborescence du système… On peut très vite franchir la limite des 260 caractères par Path si l’on n’y prend garde !
  • Toutes les données sensibles doivent être cryptées.
  • Les données un peu volumineuses peuvent être compressées avec une librairie de type SharZipLib pour ne pas consommer le quota alloué trop vite.
  • Il est préférable d’utiliser l’IsolatedStorageSettings (comme montré dans ce billet) pour stocker des objets ou des paramètres. Cette méthode est bien plus simple que les autres.
  • Utiliser IsolatedStorageFile si vous devez avoir une logique de type flux utilisant les API des Streams. Généralement pour de grandes quantités de données ou si vous avez besoin d’un contrôle fin du contenu de l’IS. Cette technique n’est pas montrée ici, il existe beaucoup d'exemple sur le Web qui devraient faire l’affaire.

La gestion simple des paramètres

Venons-e à l’exemple montré plus haut. Le but du jeu est ici de conserver en mémoire le prénom de l’utilisateur et son choix de couleur. On pourrait placer n’importe quoi dans l’IS de la même façon, comme des images, des fichiers XML, etc.

Deux boutons : l’un pour lire, l’autre pour écrire.

Le code d’écriture :

   1: private void writeUserPreferences()
   2:         {
   3:             var iStorage = IsolatedStorageSettings.ApplicationSettings; // niveau application
   4:             // IsolatedStorageSettings.SiteSettings; au niveau site
   5:             iStorage["PRENOM"] = string.IsNullOrWhiteSpace(tbNom.Text)
   6:                                       ? "Nobody"
   7:                                       : tbNom.Text.Trim();
   8:             iStorage["COULEUR"] = cbColor.SelectedItem != null ? cbColor.SelectedItem.ToString() : "Black";
   9:             iStorage.Save();
  10:             txtResults.Text = "Préférences sauvegardées.";
  11:         }

Le code de lecture :

   1: private void readUserPreferences()
   2:         {
   3:             var iStorage = IsolatedStorageSettings.ApplicationSettings; // niveau application
   4:             // IsolatedStorageSettings.SiteSettings; au niveau site
   5:             tbNom.Text = iStorage.Contains("PRENOM") ? iStorage["PRENOM"].ToString() : string.Empty;
   6:             var cName = iStorage.Contains("COULEUR") ? iStorage["COULEUR"].ToString() : "Black";
   7:             txtResults.Text = "Relecture." + Environment.NewLine + "Prénom=" + tbNom.Text + Environment.NewLine +
   8:                               "Couleur=" + cName;
   9:             cbColor.SelectedItem = cName;
  10:         }

Comme vous le voyez, si on supprime le code propre à l’application, l’accès à l’Isolated Storage s’effectue de la façon la plus simple qu’il soit :

D’abord on récupère une instance du stockage spécifique pour la gestion des paramètres (l’autre mode d’accès à l’IS impose de gérer des répertoires, des streams, etc) :

   1: var iStorage = IsolatedStorageSettings.ApplicationSettings; // niveau application
   2:            // IsolatedStorageSettings.SiteSettings; au niveau site

 

 

Ensuite on lit ou on écrit directement dans un disctionnaire clé / valeur :

   1: iStorage["PRENOM"] = tbNom.Text.Trim();      // Lecture
   2: tbNom.Text = iStorage["PRENOM"].ToString();  // Ecriture

 

Quand on écrit, ne pas oublier d’appeler la méthode Save() du stockage pour persister les données.

L’exemple ici ne contient pas de gestion des exception : c’est mal ! :-) A vous d’en ajouter dans tout projet réel.

le code du projet ( VS 2010, SL 4) : SLISDemo.zip (14,22 kb)

Et Stay Tuned !

blog comments powered by Disqus