C# 本地储存文本的几种方式
来源:互联网 发布:淘宝助理怎么导入csv 编辑:程序博客网 时间:2024/06/07 18:03
游戏中经常会有本地储存信息的需求,一般会使用xml和json两种格式,更简单的信息也会有txt直接存。
xml是比较繁琐的方式,因为每条信息都需要自己手动编写。
上代码先:
public void SaveRecordFiles() { XmlDoc = new XmlDocument(); XmlRoot = XmlDoc.CreateElement("RegisterRecords"); XmlDoc.AppendChild(XmlRoot); XmlElement recordNode = XmlDoc.CreateElement("Records"); XmlRoot.AppendChild(recordNode); XmlRoot.SetAttribute("UserName", UtilityFunction.Encrypt(UserName)); XmlRoot.SetAttribute("Passward", UtilityFunction.Encrypt(Passward)); XmlElement serverNode = XmlDoc.CreateElement("Servers"); XmlRoot.AppendChild(serverNode); foreach (GameServerInfo info in SignUpServers) { XmlElement newElem = XmlDoc.CreateElement("Server"); newElem.SetAttribute("Name", info.Name); newElem.SetAttribute("Port", info.config.Port.ToString()); newElem.SetAttribute("IP", info.config.Ip.ToString()); serverNode.AppendChild(newElem); } try { if (!Directory.Exists(strPath)) Directory.CreateDirectory(strPath); XmlDoc.Save(docPath); } catch (System.Exception ex) { Debug.LogError(ex.Message); } } public void LoadRegisterFiles() { RegisterRecords.Clear(); XmlDoc = new XmlDocument(); try { if (!File.Exists(docPath)) return; XmlDoc.Load(docPath); } catch (System.Exception ex) { Debug.LogError(ex.Message); } XmlRoot = XmlDoc.DocumentElement; if (XmlRoot != null) { XmlElement recordNode = XmlRoot.SelectSingleNode("Records") as XmlElement; if (recordNode.HasAttribute("UserName")) UserName = UtilityFunction.Decrypt(recordNode.GetAttribute("UserName")); if (recordNode.HasAttribute("Passward")) Passward = UtilityFunction.Decrypt(recordNode.GetAttribute("Passward")); XmlNode serverNode = XmlRoot.SelectSingleNode("Servers"); if (serverNode != null) { foreach (XmlNode node in serverNode.ChildNodes) { if ((node is XmlElement) == false) continue; GameServerInfo info = new GameServerInfo(); XmlElement xmlReader = node as XmlElement; info.Name = xmlReader.GetAttribute("Name"); info.config.Port = Convert.ToInt32(xmlReader.GetAttribute("Port")); info.config.Ip = xmlReader.GetAttribute("IP"); SignUpServers.Add(info); } } } else { UserName = ""; Passward = ""; } }
以上是两个游戏中储存账号服务器信息的例子,注意需要引入名称空间System.IO和System.Xml。
相比于xml,C#中的json格式就好用的多了,因为有Newtonsoft.Json这个工具。从官网下载这个工具,在项目中引用,然后就可以用了。
示例如下:
public class JsonHelper{ public static void SaveInstanceToFile<T>(T ins, string fullPath) { FileStream file = new FileStream(fullPath, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite); using (var stream = new StreamWriter(file)) { string str = JsonConvert.SerializeObject(ins); stream.Write(str); stream.Flush(); stream.Close(); } } public static T LoadFileToInstance<T>(string fullPath) { var fs = new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); using (var stream = new StreamReader(fs)) { return JsonConvert.DeserializeObject<T>(stream.ReadToEnd()); } }}
用这个库的好处就是可以把代码中实例化的类直接序列化成文本信息储存,然后也可以直接将存好的文本信息实例化成类,然后就可以直接用了。上面的示例是工具类,用法就很简单了,类似下面这样:
public void SaveRecord<T>(object obj) { if (!Directory.Exists(strPath)) Directory.CreateDirectory(strPath); JsonHelper.SaveInstanceToFile<Model>(account,docPath); } public AccountModel LoadRecord() { if (!File.Exists(docPath)) return new Model(); return JsonHelper.LoadFileToInstance<Model>(docPath); }
其中Model就是你要实例化的类。
用.net自带的文件流工具可以操作各种文档,包括txt和上面序列化之后的json。主要的类就是三种:FileStream,StreamWriter,StreamReader。
其中FileStream用来读取和保存比较方便,但是只能操作byte字节,可通过
Decoder d= encoding.UTF8.GetDecoder();d.GetChars()等方法将其转化为字符数组。
StreamWriter,StreamReader可以直接处理字符串,例子的化上面的代码中有。stream.Flush()这个方法据说在Close()的时候可以不使用,不过保险起见,每次更改文件的流的时候还是都用一次吧。
另外文件读取会用到的类:File, FileInfo, Directory, DirectoryInfo。静态类和实例类,操作文件的创建,移动,删除等外部操作。
.net提供的序列化工具:
名称空间System.Runtime.Serialization. Formatters.Binary
方法:
IFormatter serializet =new BinaryFormatter();
serializer.Serialize(myStream, myObject);
反序列化用Deserialize(myStream) as MyObjectType;
对这方面还是初学,如有错误欢迎指正。
- C# 本地储存文本的几种方式
- Android 数据储存的方式之本地数据库储存
- iOS 几种常见的数据储存方式
- iOS开发常用的几种储存方式
- Android中数据储存方式的几种工具类
- android 本地存储的几种方式
- 图的几种储存结构
- 关于控件文本的Visibal的几种方式
- C# 剪切板操作的几种方式
- C# 发送邮件的几种方式
- C# 连接 Oracle 的几种方式
- C#窗体间传值的几种方式
- C#几种创建线程的方式
- C#打印条码的几种方式
- C# 拷贝数组的几种方式
- C# 连接 Oracle 的几种方式
- C# 连接 Oracle 的几种方式
- C#打印条码的几种方式
- Android截屏浅析
- QQ提示信息的拖动效果
- 【spring-security】j_spring_security_check 404
- Hibernate中的Criteria用法
- Jboss 服务器SSL证书安装指南
- C# 本地储存文本的几种方式
- Android使用OkHttp post 键值对
- 在Xcode7中安装Alcatraz安装失败,超有用
- IPhone升级防流量偷跑iOS省流量技巧
- cvQueryHistValue_1D函数编译报错的解决方法
- Android中的广播Broadcast详解
- JComboBox添加item的赋值类型问题!不一致的话会导致不能更改jcombobox的选择值
- 安装运行Hadoop
- 点击input输入法不弹出