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 settinglocalSettings.Values.Remove("exampleCompositeSetting");
ApplicationDataContainer的用法
支援建立、刪除、枚舉、資料容器層次的貫穿
Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;// Create a setting in a containerWindows.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 containerbool hasContainer = localSettings.Containers.ContainsKey("exampleContainer");bool hasSetting = false;if (hasContainer){ hasSetting = localSettings.Containers["exampleContainer"].Values.ContainsKey("exampleSetting");}// Delete a containerlocalSettings.DeleteContainer("exampleContainer");
ApplicationDataContainerSettings的用法
最簡單的索引值對儲存
var localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; // Create a simple settinglocalSettings.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 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(); } }
取檔案資料
static async public Task RestoreAsync(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_; }
以上就是Metro Style App中資料存放區的幾種方式,怎麼樣,跟Windows Phone7中還是有些差別的吧。。。
順便整理一下xml/json格式資料的序列與還原序列化的通用方法
JSON資料的序列與反序列
public static T DataContractJsonDeSerializer(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; }
XML資料的序列與反序列
/// /// 需要序列化XML資料對象 /// /// 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; } /// /// XML資料還原序列化 /// /// 還原序列化對象 /// public static T XMLDeserialize(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); } }