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·