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

            }

        }
  
    

你可能感兴趣的:(windows)