En développant sur Windows Phone 7 on passe nécessairement par un étape où l'on se demande comment sauvegarder nos données sur le téléphone.
Je ne reviendrais pas ici sur le fonctionnement de la gestion des fichiers dans les applications pour WP7, vous trouverez un article ici très bien détaillé. Non, je vous propose ici une classe générique vous permettant de sauvegarder une classe vers un fichier dans vous soucier justement du fonctionnement de l'isolate storage !
L'idée est de sérialiser votre objet et de générer un fichier contenant le flux sérialisé. avec ce code il ne vous faudra plus que le nom du fichier à utiliser !
Pour commencer, il nous faut notre objet à enregistrer :
On utilisera les classes Player et PlayersBdd. La première contiendra des informations sur un joueur tel que son nom et son score, la seconde classe contiendra une liste de players, cela fera office d'une BDD
:
public class Player
{
public String Name { get; set; }
public Int32 Points { get; set; }
public Player()
{
}
public Player(String name, Int32 points)
{
this.Name = name;
this.Points = points;
}
}
public class PlayersBdd
{
public List<Player> Players { get; set; }
public PlayersBdd()
{
}
public void AddPlayer(Player p)
{
if (Players.Count(pl => pl.Name != p.Name) == 0)
{
this.Players.Add(p);
}
}
}
Il nous faut maintenant notre classe générique permettant de sérialiser une classe et stocker le flux dans un fichier :
public static class SerialisationHelper
{
public static T Load<T>(String fileName) where T : new()
{
IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
if (store.FileExists(fileName))
{
IsolatedStorageFileStream stream = store.OpenFile(fileName, FileMode.Open);
XmlSerializer serializer = new XmlSerializer(typeof(T));
try
{
T _return = new T();
_return = (T)serializer.Deserialize(stream);
stream.Close();
return _return;
}
catch (Exception)
{
stream.Close();
return default(T);
}
}
else
return default(T);
}
public static void Save<T>(T objectToSerialise, String fileName)
{
IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
XmlWriterSettings writerSettings =
new XmlWriterSettings
{
Indent = true,
IndentChars = "\t"
};
IsolatedStorageFileStream stream = store.OpenFile(fileName, FileMode.Create);
try
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (XmlWriter xmlWriter = XmlWriter.Create(stream, writerSettings))
{
serializer.Serialize(xmlWriter, objectToSerialise);
}
}
catch (Exception emAll)
{
throw emAll;
}
stream.Close();
}
}
Et maintenant que l'on a de quoi sérialiser tout et n'importe quoi, on va modifier notre classe PlayersBdd pour pouvoir la sauver/recharger :
public class PlayersBdd
{
public List<Player> Players { get; set; }
public PlayersBdd()
{
}
public void AddPlayer(Player p)
{
if (this.Players.Count(pl => pl.Name == p.Name) == 0)
{
this.Players.Add(p);
}
}
public void Load()
{
PlayersBdd _p = SerialisationHelper.Load<PlayersBdd>("playersFile.xml");
if (_p != null && _p.Players != null)
this.Players = _p.Players;
else
this.Players = new List<Player>();
}
public void Save()
{
SerialisationHelper.Save<PlayersBdd>(this, "playersFile.xml");
}
}
Et voilà, le tour est joué, on peut maintenant appeller Load() ou Save() de notre objet PlayersBdd selon si l'on veut charger les données du fichier sérialisé ou sauver l'objet justement, le tout en deux lignes de code !
Et pour télécharger le code source d'une application démo : c'est ici.