Anbarasi
Anbarasi

Reputation: 421

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

As your suggestion i used below to write the file with a list of the below class ** public class Feed { public string Title { get; set; } public string SectionName { get; set; } public List Articles { get; set; } }**

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

Below is the code to read the saved file

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

Below is the XML format i am getting while read as a textContent

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

Upvotes: 0

Views: 153

Answers (3)

Archana
Archana

Reputation: 3221

Where key is filename, value is content to be stored to file(a list)

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

Upvotes: 1

Anbarasi
Anbarasi

Reputation: 421

Below is the class of the List

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

Saving File in Local

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

Retrieving File from Local

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

It retrieves the list perfectly.

Upvotes: 0

odinel
odinel

Reputation: 566

You can create a Serializer class to do this, like so:

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

Then you can use the class to serialize to an Xml string and save to 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;

To get the list of objects back again from Storage, call it like this:

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

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

Upvotes: 1

Related Questions