【问题标题】:Saving and retrieving list to a local storage (Windows Phone 8.1 & C#)将列表保存和检索到本地存储(Windows Phone 8.1 和 C#)
【发布时间】:2016-06-22 06:45:22
【问题描述】:

根据您的建议,我在下面使用以下类的列表编写文件** public class Feed { 公共字符串标题 { 获取;放; } 公共字符串 SectionName { 获取;放; } 公开列表文章{获取;放; } }**

 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>

【问题讨论】:

  • 您必须序列化并存储到文件中。
  • @LovetoCode 感谢您的回复。您能否提供一个示例,说明如何序列化列表并将其保存为文件以及如何从文件中检索列表

标签: c# windows-phone-8.1


【解决方案1】:

您可以创建一个 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;

要再次从 Storage 中取回对象列表,可以这样调用:

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

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

【讨论】:

  • 感谢您的回复。我的提要也将包含 20 个列表。我无法将其写入本地存储。它抛出一个错误状态管理器设置值的大小已超过限制。尝试写入应用程序数据容器值时出错
  • 是的,存储到本地设置中的大小有限制。在文件的上述答案中写入Xml字符串(我已经在我的答案中写了)
  • 很抱歉无法找到您。你要说什么
  • 我是说写入文件而不是本地设置localSettings.Values["Feeds"] = Xml 将此Xml 写入文件
【解决方案2】:

其中 key 是文件名,value 是要存储到文件(列表)的内容

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

【讨论】:

  • 感谢您的代码。如何声明方法 ReadFileAsync。我调用了这样的方法 await ReadFileAsync("FileName"),但它会抛出类似 无法推断方法“MainPage.ReadFileAsync(string)”的类型参数的错误用法。尝试明确指定类型参数
  • 喜欢这个ReadFileAsync&lt;string&gt;(filename)。如果是List&lt;string&gt;,那么ReadFileAsync&lt;List&lt;string&gt;&gt;(filename)
  • 我可以写入文件,但无法读取文件。它抛出错误所有非 UTF8 文档都需要 XML 声明。
  • 仅使用 WriteFileAsync 方法我正在写入文件。我没有使用任何单独的方法
  • 我明白这一点。我要问的是你在T value 地方传递给WriteFileAsync() 的类型
【解决方案3】:

下面是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; }
    }

在本地保存文件

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

它完美地检索列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多