概述
游戏中经常会有本地储存信息的需求,一般会使用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# 本地储存文本的几种方式的全部内容,希望文章能够帮你解决C# 本地储存文本的几种方式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复