Windows 8學習筆記(四)--Storage數據存儲


AppData在Metro App中的存儲主要由兩種形式,一種是鍵值對的形式,還有一種是StorageFile文件的存儲形式。

其中鍵值對形式的存儲又分幾種:ApplicationDataCompositeValue復合值存儲、ApplicationDataContainer容器數據存儲、ApplicationDataContainerSettings普通的容器數據存儲。

注意這種鍵值對的存儲值只能以字符形式存儲,若要存儲某對象,需轉成XMLjson等其它字符數據。

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 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);
            }
        }
  
  
  
          


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM