个人资料

跳过导航链接首页 > 博客列表 > 博客正文

uwp应用程序中对xml文件反序列化

分类:

    xml和json是移动开发中较为常见的数据存储文件,这里介绍xml在uwp中反序列化的代码。首先在uwp中,程序的操作文件的权限只在一个微软限定的文件夹内(localFolder),如果操作文件夹意外的文件需要用户手动选择路径。

    我通常的做法是在程序第一次加载安装时将我的xml文件复制到LocalFolder文件夹,这样就可以随意操作数据文件了,不过这样风险也是有的,如果程序依赖此项数据文件,而文件遭到外部破坏,可能会使程序出错,不过代码中考虑这方面就好。

    回到正题,在uwp中对xml反序列化首先需要建立一个根据xml格式定制的类。我的一个小游戏xml格式如下:

<?xml version="1.0" encoding="utf-8" ?>
<Levels>
  <Level Index="1" Name="第 1 关" Time="40" Rate="40" Locked="0" Stars="0" MouseAmountFlag="4" MouseTypeFlag="精灵鼠" />
  <Level Index="2" Name="第 2 关" Time="40" Rate="38" Locked="0" Stars="0" MouseAmountFlag="4" MouseTypeFlag="疯狂鼠"/>
</Levels>
    这个格式虽然简单,但是具有一定的通用型。更加复杂的xml格式大概也只不过是嵌套而已,根据我这个稍微增加嵌套内容即可。那么这个类怎么建立?代码如下
   [XmlRoot("Levels")]
    public class AllLevels
    {       
        private List<Level> LevelList=new List<Level>();
        [XmlElement(ElementName = "Level")]
        public List<Level> Levels
        {
            get { return LevelList; }
            set { LevelList = value; }
        }
    }
    public class Level
    {
        public Level() { }
        [XmlAttribute("Index")]
        public string Index { get; set; }
        [XmlAttribute("Name")]
        public string Name { get; set; }
        [XmlAttribute("Time")]
        public string Time { get; set; }
        [XmlAttribute("Rate")]
        public string Rate { get; set; }
        [XmlAttribute("Locked")]
        public string Locked { get; set; }
        [XmlAttribute("Stars")]
        public string Stars { get; set; }
        [XmlAttribute("MouseAmountFlag")]
        public string MouseAmountFlag { get; set; }
        [XmlAttribute("MouseTypeFlag")]
        public string MouseTypeFlag { get; set; }
    }
    AllLevels是一个类,下面有属性Levels是一个list类型,list的每一项都是一个Level类,将xml反序列化后,第一关的对象就是
all_levels.Levels[0]
    反序列化代码如下:


            StorageFile LocalXmlFile = await folder.GetFileAsync("levels");
            string s;
            using (Stream File = await LocalXmlFile.OpenStreamForReadAsync())
            {
                using (StreamReader read = new StreamReader(File))
                {
                    s = read.ReadToEnd();                   
                }
            }       
            XmlSerializer xmlSearializer = new XmlSerializer(typeof(AllLevels));
            AllLevels all_levels;
            using (StringReader sr = new StringReader(s))
            {
                all_levels = (AllLevels)xmlSearializer.Deserialize(sr);
            }
    其中all_levels就是反序列化返回的对象,需要引用


    using Windows.Data.Xml.Dom;

    需要说明,由于uwp的机制问题,读写本地文件需要多多注意文件是否存在和是否被破坏,关于这一点我会在下一篇文章中讨论。


·END·

songshizhao
最初发表2017/4/9 13:51:30 最近更新2017/4/9 13:51:30 4523
为此篇作品打分
10
   评论