AppData在Metro App中的存储主要由两种形式,一种是键值对的形式,还有一种是StorageFile文件的存储形式。
其中键值对形式的存储又分几种:ApplicationDataCompositeValue复合值存储、ApplicationDataContainer容器数据存储、ApplicationDataContainerSettings普通的容器数据存储。
注意这种键值对的存储值只能以字符形式存储,若要存储某对象,需转成XML或json等其它字符数据。
ApplicationDataCompositeValue的用法
支持复合值的存储
Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; // Create a composite setting Windows.Storage.ApplicationDataCompositeValue composite = new Windows.Storage.ApplicationDataCompositeValue(); composite[ "intVal" ] = 1; composite[ "strVal" ] = "string" ; localSettings.Values[ "exampleCompositeSetting" ] = composite; // Read data from a composite settingWindows.Storage.ApplicationDataCompositeValue composite = (Windows.Storage.ApplicationDataCompositeValue)localSettings.Values["exampleCompositeSetting"]; // Delete a composite setting localSettings.Values.Remove( "exampleCompositeSetting" ); |
ApplicationDataContainer的用法
支持创建、删除、枚举、数据容器层次的贯穿
Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; // Create a setting in a container Windows.Storage.ApplicationDataContainer container = localSettings.CreateContainer( "exampleContainer" , Windows.Storage.ApplicationDataCreateDisposition.Always); if (localSettings.Containers.ContainsKey( "exampleContainer" )) { localSettings.Containers[ "exampleContainer" ].Values[ "exampleSetting" ] = "Hello Windows" ; } // Read data from a setting in a container bool hasContainer = localSettings.Containers.ContainsKey( "exampleContainer" ); bool hasSetting = false ; if (hasContainer) { hasSetting = localSettings.Containers[ "exampleContainer" ].Values.ContainsKey( "exampleSetting" ); } // Delete a container localSettings.DeleteContainer( "exampleContainer" ); |
ApplicationDataContainerSettings的用法
最简单的键值对存储
var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; // Create a simple setting localSettings.Values[ "exampleSetting" ] = "Hello Windows 8" ; if (localSettings.Values.ContainsKey( "exampleSetting" )) { // Read data from a simple setting Object value = localSettings.Values[ "exampleSetting" ]; } localSettings.Values.Remove( "exampleSetting" ); |
StorageFile的存储,以文件的形式进行存储
存入数据
static async public Task SaveAsync<t>(T data, string fileName) { // Get the output stream for the SessionState file. StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); IRandomAccessStream raStream = await file.OpenAsync(FileAccessMode.ReadWrite); using (IOutputStream outStream = raStream.GetOutputStreamAt(0)) { // Serialize the Session State. DataContractSerializer serializer = new DataContractSerializer( typeof (T)); serializer.WriteObject(outStream.AsStreamForWrite(), data); await outStream.FlushAsync(); } }</t> |
取文件数据
static async public Task<t> RestoreAsync<t>( string filename) { // Get the input stream for the SessionState file. T sessionState_ = default (T); try { StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(filename); if (file == null ) return sessionState_; IInputStream inStream = await file.OpenSequentialReadAsync(); // Deserialize the Session State. DataContractSerializer serializer = new DataContractSerializer( typeof (T)); sessionState_= (T)serializer.ReadObject(inStream.AsStreamForRead()); } catch (Exception) { // Restoring state is best-effort. If it fails, the app will just come up with a new session. } return sessionState_; }</t></t> |
以上就是Metro Style App中数据存储的几种方式,怎么样,跟Windows Phone7中还是有些差别的吧。。。
顺便整理一下xml/json格式数据的序列与反序列化的通用方法
JSON数据的序列与反序列
public static T DataContractJsonDeSerializer<t>( string jsonString) { var ds = new DataContractJsonSerializer( typeof (T)); var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); T obj = (T)ds.ReadObject(ms); ms.Dispose(); return obj; } public static string ToJsonData( object item) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType()); string result = String.Empty; using (MemoryStream ms = new MemoryStream()) { serializer.WriteObject(ms, item); ms.Position = 0; using (StreamReader reader = new StreamReader(ms)) { result = reader.ReadToEnd(); } } return result; }</t> |
XML数据的序列与反序列
/// <summary>
/// 需要序列化XML数据对象
/// </summary>
/// <param name="objectToSerialize"><returns></returns>
public
static
string
XMLSerialize(
object
objectToSerialize)
{
string
result =
""
;
using
(MemoryStream ms =
new
MemoryStream())
{
DataContractSerializer serializer =
new
DataContractSerializer(objectToSerialize.GetType());
serializer.WriteObject(ms, objectToSerialize);
ms.Position = 0;
using
(StreamReader reader =
new
StreamReader(ms))
{
result = reader.ReadToEnd();
}
}
return
result;
}
/// <summary>
/// XML数据反序列化
/// </summary>
/// <typeparam name="T">反序列化对象</typeparam>
/// <param name="xmlstr"><returns></returns>
public
static
T XMLDeserialize<t>(
string
xmlstr)
{
byte
[] newBuffer = System.Text.Encoding.UTF8.GetBytes(xmlstr);
if
(newBuffer.Length == 0)
{
return
default
(T);
}
using
(MemoryStream ms =
new
MemoryStream(newBuffer))
{
DataContractSerializer serializer =
new
DataContractSerializer(
typeof
(T));
return
(T)serializer.ReadObject(ms);
}
}</t>
Trackback:
http://www.cnblogs.com/jing870812/archive/2012/04/05/2433753.html