Windows Store applications can persist runtime state, user preferences, and other settings using different mechanisms:
- Local: Persistent data that exists only on the current device.
- Roaming: Data that exists on all devices on which the user has installed the app.
- Temporary: Data that could be removed by the system at any time.
var localSettings = ApplicationData.Current.LocalSettings;
var roamingSettings = ApplicationData.Current.RoamingSettings;
var tempFolder = ApplicationData.Current.TemporaryFolder;
In this post I will share my helper class to store objects using the LocalSettings container.
One problem I found when I tried to save an object to the LocalSettings is that it only supports the following types:
UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double
Boolean
Char16, String
DateTime, TimeSpan
GUID, Point, Size, Rect
ApplicationDataCompositeValue
For the application that I am working on I needed to store an instance of my settings data class, this class was already prepared for serialization. After playing around a little bit I found an easy solution implementing a helper class that serializes my object to XML and saves it as string.
StorageManager.cs
using Windows.Storage;
namespace WindowsStore.Common.Storage
{
public class StorageManager
{
/// <summary>
/// Initializes a new instance of the <see cref="StorageManager" /> class.
/// As the LocalSettings is divided in containers the constructor needs the key of the container to use.
/// </summary>
/// <param name="containerKey">The key.</param>
/// <param name="isRoaming">if set to <c>true</c> [is roaming].</param>
public StorageManager(string containerKey, bool isRoaming)
{
if (isRoaming)
{
InitializeRoamingAppContainer(containerKey);
}
else
{
InitializeLocalAppContainer(containerKey);
}
}
/// <summary>
/// Determines whether the local storage contains an object associated to the specified key.
/// </summary>
public bool Contains(string key)
{
return AppSettingsContainer.Values.ContainsKey(key);
}
/// <summary>
/// Saves the specified object associated to the specified key.
/// </summary>
public void Save(string key, object value)
{
var serializedValue = XMLSerializer.SerializeToString(value);
if (AppSettingsContainer.Values.ContainsKey(key))
{
AppSettingsContainer.Values[key] = serializedValue;
}
else
{
AppSettingsContainer.Values.Add(key, serializedValue);
}
}
/// <summary>
/// Loads an object associated to the specified key.
/// </summary>
public T Load<T>(string key)
{
if (AppSettingsContainer.Values.ContainsKey(key))
{
return XMLSerializer.DeserializeFromString<T>(AppSettingsContainer.Values[key].ToString());
}
return default(T);
}
/// <summary>
/// Removes the object associated to the specified key.
/// </summary>
public bool Remove(string key)
{
if (AppSettingsContainer.Values.ContainsKey(key))
{
return AppSettingsContainer.Values.Remove(key);
}
return false;
}
#region privates
/// <summary>
/// Initializes a roaming application container.
/// </summary>
/// <param name="containerKey">The container key.</param>
private void InitializeRoamingAppContainer(string containerKey)
{
// todo RoamingQuota
if (!ApplicationData.Current.RoamingSettings.Containers.ContainsKey(containerKey))
{
ApplicationData.Current.RoamingSettings.CreateContainer(containerKey,
ApplicationDataCreateDisposition.Always);
}
this.AppSettingsContainer = ApplicationData.Current.RoamingSettings.Containers[containerKey];
}
/// <summary>
/// Initializes a local application container.
/// </summary>
/// <param name="containerKey">The container key.</param>
private void InitializeLocalAppContainer(string containerKey)
{
if (!ApplicationData.Current.LocalSettings.Containers.ContainsKey(containerKey))
{
ApplicationData.Current.LocalSettings.CreateContainer(containerKey,
ApplicationDataCreateDisposition.Always);
}
this.AppSettingsContainer = ApplicationData.Current.LocalSettings.Containers[containerKey];
}
/// <summary>
/// Gets or sets the application settings container.
/// </summary>
private ApplicationDataContainer AppSettingsContainer { get; set; }
#endregion
}
}
XMLSerializer.cs
using System.IO;
using System.Xml.Serialization;
namespace WindowsStore.Common.Storage
{
public static class XMLSerializer
{
/// <summary>
/// Serializes an object to string using XML.
/// </summary>
/// <param name="obj">The object.</param>
public static string SerializeToString(object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, obj);
return writer.ToString();
}
}
/// <summary>
/// De-serializes an object from XML string.
/// </summary>
/// <typeparam name="T">Type of the object to deserialize</typeparam>
/// <param name="xml">The XML.</param>
public static T DeserializeFromString<T>(string xml)
{
XmlSerializer deserializer = new XmlSerializer(typeof(T));
using (StringReader reader = new StringReader(xml))
{
return (T)deserializer.Deserialize(reader);
}
}
}
}
References:
Like this:
Like Loading...