簡體   English   中英

將列表保存並檢索到本地存儲中(Windows Phone 8.1&C#)

[英]Saving and retrieving list to a local storage (Windows Phone 8.1 & C#)

作為您的建議,我在下面使用以下類的列表編寫文件:** public class Feed {public string Title {get; 組; }公共字符串SectionName {get; 組; }公共列表文章{get; 組; }} **

 public async Task<bool> WriteFileAsync<T>(string key, T value)
            {
                var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(key, CreationCollisionOption.ReplaceExisting);
                //serialize
                using (MemoryStream ms = new MemoryStream())
                {
                    try
                    {
                        var serailizer = new DataContractSerializer(value.GetType());
                        serailizer.WriteObject(ms, value);
                        ms.Position = 0;
                        StreamReader reader = new StreamReader(ms);
                        var content = reader.ReadToEnd();
                        await FileIO.WriteTextAsync(file, content);
                        return true;
                    }
                    catch (Exception e)
                    {
                        return false;
                    }
                }
            }

await WriteFileAsync("Article", feeds);

下面是讀取保存文件的代碼

 public async Task<T> ReadFileAsync<T>(string key)
        {
            var file = await ApplicationData.Current.LocalFolder.GetFileAsync(key);
            if (file == null)
                return default(T);
            var textContent = await FileIO.ReadTextAsync(file);
            //Deserialize
            using (StringReader reader = new StringReader(textContent))
            {
                using (XmlReader xmlReader = XmlReader.Create(reader))
                {
                    var serializer = new DataContractSerializer(typeof(T));
                    T theObject = (T)serializer.ReadObject(xmlReader);
                    return theObject;
                }
            }
        }

await ReadFileAsync<List<string>>("Article");

以下是我作為textContent讀取時得到的XML格式

<ArrayOfFeed xmlns="http://schemas.datacontract.org/2004/07/MMRevamp_2016.ViewModels" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Feed><Articles><Article><Abstract>இலங்கையில் தொடர்ந்து பெய்துவரும் தென்மேற்கு பருவமழையின் விளைவாக தலைநகர் கொழும்பு உள்ளிட்ட பல பகுதிகள் வெள்ளக்காடாக காட்சி அளிக்கின்றன. அரநாயக பகுதியில் நேற்று பின்னிரவு ஏற்பட்ட நிலச்சரிவில் மூன்று கிராமங்கள் மண்ணில் புதைந்தன. இதில் சிக்கியவர்களில் 15 பேரின் பிரேதங்கள் மீட்கப்பட்டுள்ளன.</Abstract><ArticleDetail>கொழும்பு:&#xD;
இலங்கையின் பல பகுதிகளில் கடந்த 15-ம் தேதியில் இருந்து பெய்துவரும் பரவலான மழையின் விளைவாக நாட்டின் பல பகுதிகள் வெள்ளக்காடாக காட்சியளிக்கின்றன. குறிப்பாக, கெகல்லே மாவட்டத்தில் தொடர்ந்து பெய்த அடைமழையின் விளைவாக வெள்ளத்தோடு சேர்ந்து நிலச்சரிவும் ஏற்பட்டுள்ளது.&#xD;
இதனால் பாதிக்கப்பட்ட பகுதிகளில் இருந்து சுமார் ஒன்றரை லட்சம் மக்கள் பாதுகாப்பான பகுதிகளுக்கு அழைத்து செல்லப்பட்டு, நிவாரண முகாம்களில் தங்க வைக்கப்பட்டுள்ளனர். இதுதவிர தங்களது இருப்பிடத்துக்கு அருகாமையில் உள்ள கோயில் போன்ற பொது கட்டிடங்களில் ஆயிரக்கணக்கான மக்கள் தஞ்சம் அடைந்துள்ளனர்.&#xD;
இந்நிலையில், இலங்கையின் மத்தியப் பகுதியில் தலைநகர் கொழும்புவில் இருந்து சுமார் 140 கிலோமீட்டர் தூரத்தில் உள்ள மலைப்பிரதேசமான அரநாயக பகுதியில் நேற்று பின்னிரவு ஏற்பட்ட நிலச்சரிவால் பாறைகள் உருண்டுவந்து அருகாமையில் உள்ள கிராமங்களின்மீது விழுந்தன. இதில் மூன்று கிராமங்களில் உள்ள வீடுகள் மண்ணுக்குள் புதைந்து விட்டதாகவும், அப்பகுதியில் தேசிய பேரிடர் மீட்புப் படையினர் மீட்பு நடவடிக்கைகளில் ஈடுபட்டு வருகின்றனர்.&#xD;
இங்கு வசித்துவந்த 200-க்கும் மேற்பட்ட குடும்பங்கள் மண்ணுக்குள் புதைந்திருப்பதாக தெரியவந்துள்ள நிலையில் இன்றுகாலை நிலவரப்படி பலர் மீட்கப்பட்டுள்ளதாகவும். இதுவரை 15 பிரேதங்கள் கண்டெடுக்கப்பட்டுள்ளதாகவும் தேசிய பேரிடர் மீட்பு முகமையின் செய்தி தொடர்பாளர் பிரதீப் கோடிப்பள்ளி தெரிவித்துள்ளார்.&#xD;
புத்தளம், தப்போவ தம்பபன்னிய கிராமத்தில் 70 குடும்பங்களைச் சேர்ந்த 205 பேர் வெள்ளத்தில் சிக்குண்டுள்ள நிலையில், அவர்களை மீட்கும் நடவடிக்கைகள் முப்படையினரின் துணையுடன் நடைபெற்று வருவதாகவும் அவர் கூறினார்.</ArticleDetail><HeadLine>இலங்கையில் பேயாட்டம் போடும் பெருமழை: மூன்று கிராமங்கள் நிலச்சரிவில்...</HeadLine><ImageURL>http://img.maalaimalar.com/Articles/2016/May/201605181203113714_landslide-buries-three-villages-in-sri-lanka-hundreds-of_SECVPF.gif</ImageURL><Title>இலங்கையில் தொடர்ந்து பெய்துவரும் தென்மேற்கு பருவமழையின் விளைவாக தலைநகர் கொழும்பு உள்ளிட்ட பல பகுதிகள் வெள்ளக்காடாக காட்சி அளிக்கின்றன. அரநாயக பகுதியில் நேற்று பின்னிரவு ஏற்பட்ட நிலச்சரிவில் மூன்று கிராமங்கள் மண்ணில் புதைந்தன. இதில் சிக்கியவர்களில் 15 பேரின் பிரேதங்கள் மீட்கப்பட்டுள்ளன.</Title></Article><Article><Abstract>கருவில் இருக்கும் குழந்தையின் பாலினத்தை கண்டறியும் சோதனை நடத்தியதாக டெல்லியில் 6 பேரை போலீசார் கைது செய்தனர்.</Abstract><ArticleDetail>புதுடெல்லி:&#xD;
டெல்லியில் மத்திய மார்க்கெட் பகுதியில் உள்ள ஒரு தனியார் நோய் பரிசோதனை மையத்தில் (கிளினிக்) விதிமுறைகளை மீறி கர்ப்பிணி பெண்களுக்கு ஆண்-பெண் குழந்தைகளை கண்டறியும் பாலின சோதனை நடத்தப்படுவதாக பெண் சிசுக்கொலை தடுப்பு குழுவினருக்கு தகவல் கிடைத்தது.&#xD;
அதன்பேரில் ஹரியானா மற்றும் டெல்லி பெண் சிசுக்கொலை தடுப்பு குழுவினர் இணைந்து சம்பவ இடத்துக்கு சென்றபோது அங்கு கர்ப்பிணி பெண்களுக்கு கருவில் இருக்கும் குழந்தையின் பாலினத்தை கண்டறியும் சோதனை நடத்தியது கண்டுபிடிக்கப்பட்டது.&#xD;
இதையடுத்து பரிசோதனை மையத்தை நடத்தி வந்த டாக்டர் முத்ரேஜா மற்றும் 2 பேரை போலீசார் கைது செய்தனர். மேலும், பரிசோதனை மையத்திற்கு சோதனைக்காக சென்ற 2 கர்ப்பிணி பெண்கள் உள்பட 3 பேரையும் போலீசார் கைது செய்தனர். இதில் தலைமறைவான 2 பேரை தேடி வருகின்றனர்.</ArticleDetail><HeadLine>கருவில் இருக்கும் குழந்தை பற்றிய பாலின சோதனை: 6 பேர் கைது</HeadLine><ImageURL>http://img.maalaimalar.com/Articles/2016/Jun/201606200207249771_six-held-in-delhi-for-Gender-Prediction-Tests_SECVPF.gif</ImageURL><Title>கருவில் இருக்கும் குழந்தையின் பாலினத்தை கண்டறியும் சோதனை நடத்தியதாக டெல்லியில் 6 பேரை போலீசார் கைது செய்தனர்.</Title></Article></Articles><SectionName>TopNews</SectionName><Title>தலைப்புச்செய்திகள்</Title></Feed></ArrayOfFeed>

鍵是文件名,值是要存儲到文件的內容(列表)

public async Task<bool> WriteFileAsync<T>(string key,T value)
{
     var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(key, CreationCollisionOption.ReplaceExisting);

     // serialize
     using(MemoryStream ms = new MemoryStream())
     {
         try
         {
             var serializer = new DataContractSerializer(value.GetType());
             serializer.WriteObject(ms, value);

             ms.Position = 0;
             StreamReader reader = new StreamReader(ms);
             var content = reader.ReadToEnd();

             await FileIO.WriteTextAsync(file, content);

             return true;
         }
         catch (Exception e)
         {
             return false;
         }
     }
 }

 public async Task<T> ReadFileAsync<T>(string key)
 {
     var file = await ApplicationData.Current.LocalFolder.GetFileAsync(key);

     if(file == null)
         return default(T);

     var textContent = await FileIO.ReadTextAsync(file);

     // Deserialize
     using (StringReader reader = new StringReader(textContent))
     {
         using (XmlReader xmlReader = XmlReader.Create(reader))
         {
             var serializer = new DataContractSerializer(typeof(T));
             T theObject = (T)serializer.ReadObject(xmlReader);
             return theObject;
         }
     }

     //   using (MemoryStream ms = new //MemoryStream(Encoding.Unicode.GetBytes(textContent)))
     //{
     //  try
     //  {
     // var serializer = new DataContractSerializer(typeof(T));
     // return (T)serializer.ReadObject(ms);
     //}
     // catch (Exception e)
     //{
     //return default(T);
     // }
     //
     }
}

您可以創建一個Serializer類來執行此操作,如下所示:

using System.IO;
using System.Xml.Serialization;

public class Serializer
{
/// <summary>
/// Serialize an object to an XML string
/// </summary>    
public string Serialize(object obj)
{
    using (var sw = new StringWriter())
    {
        var serializer = new XmlSerializer(obj.GetType());
        serializer.Serialize(sw, obj);
        return sw.ToString();
    }
}
/// <summary>
/// Deserialize an XML string to an object
/// </summary>   
public T Deserialize<T>(string xml)
{
    using (var sw = new StringReader(xml))
    {
        var serializer = new XmlSerializer(typeof(T));
        return (T)serializer.Deserialize(sw);
    }
}
}

然后,您可以使用該類來序列化為Xml字符串並保存到Storage中:

List<Feed> feeds = new List<Feed>();
        Feed feed1 = new Feed();
        feed1.Title = "A Title";
        feed1.SectionName = "Section name";

        Feed feed2 = new Feed();
        feed2.Title = "Another title";
        feed2.SectionName = "Another section name";

        feeds.Add(feed1);
        feeds.Add(feed2);

        //Serialize to Xml string
        Serializer serializer = new Serializer();
        string Xml = serializer.Serialize(feeds);

        //Save to local storage
        Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
        localSettings.Values["Feeds"] = Xml;

要從存儲再次獲取對象列表,請像這樣調用它:

//Get the objects back from Storage
        string XmlToDeserialize = localSettings.Values["Feeds"].ToString();

        List<Feed> feedsFromStorage = serializer.Deserialize<List<Feed>>(XmlToDeserialize);

以下是列表的類別

public class Feed
    {
        public string Title { get; set; }
        public string SectionName { get; set; }
        public List<Article> Articles { get; set; }
        public Object ArticlesList { get; set; }
    }

將文件保存在本地

public static async Task<bool> SaveSetting(string Key, Object value)
        {
            var ms = new MemoryStream();
            DataContractSerializer serializer = new DataContractSerializer(value.GetType());
            serializer.WriteObject(ms, value);
            await ms.FlushAsync();

            ms.Seek(0, SeekOrigin.Begin);
            StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(Key, CreationCollisionOption.ReplaceExisting);
            using (Stream fileStream = await file.OpenStreamForWriteAsync())
            {
                await ms.CopyToAsync(fileStream);
                await fileStream.FlushAsync();
            }
            return true;
        }

從本地檢​​索文件

public async static Task<Feed> ReadSetting<type>(string Key)
        {
            var rr = new Feed();

            try
            {
                var ms = new MemoryStream();
                DataContractSerializer serializer = new DataContractSerializer(typeof(type));

                StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(Key);
                using (IInputStream inStream = await file.OpenSequentialReadAsync())
                {
                    rr.ArticlesList = (type)serializer.ReadObject(inStream.AsStreamForRead());
                }
            }
            catch (FileNotFoundException)
            {

            }
            return rr;
        }

它可以完美地檢索列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM