存档和读档

游戏中每每须要存档和读档,进行游戏的保存和读取,游戏的存档和读档其实就是对象的序列化和反序列化。若是游戏中须要存储的类是Save,那么有三种方式进行存档和读档。web

//数据类
[System.Serializable]
public class Save
{
  	public List<int> livingTargetPositions = new List<int>();
    public List<int> livingMonsterTypes = new List<int>();

    public int shootNum = 0;
    public int score = 0;
}
//二进制方式
//存储
BinaryFormatter bf = new BinaryFormatter();
//建立一个文件流
FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile" + "/byBin.txt");
//用二进制格式化程序的序列化方法来序列化Save对象,参数:建立的文件流和须要序列化的对象
bf.Serialize(fileStream, save);
//关闭流
fileStream.Close();
//若是文件存在,则显示保存成功
if (File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt"))
{
    print("保存成功");
}


//读取
BinaryFormatter bf = new BinaryFormatter();
//打开一个文件流
FileStream fileStream = File.Open(Application.dataPath + "/StreamingFile" + "/byBin.txt", FileMode.Open);
//调用格式化程序的反序列化方法,将文件流转换为一个Save对象
Save save= (Data)bf.Deserialize(fileStream);
//关闭文件流
fileStream.Close();
using LitJson;

//Json方式
//存档
string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";
//利用JsonMapper将save对象转换为Json格式的字符串
string saveJsonStr = JsonMapper.ToJson(save);
//将这个字符串写入到文件中
//建立一个StreamWriter,并将字符串写入文件中
StreamWriter sw = new StreamWriter(filePath);
sw.Write(saveJsonStr);
//关闭StreamWriter
sw.Close();
print("保存成功");


//读档
//建立一个StreamReader,用来读取流
string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";
StreamReader sr = new StreamReader(filePath);
//将读取到的流赋值给jsonStr
string jsonStr = sr.ReadToEnd();
//关闭
sr.Close();
//将字符串jsonStr转换为Save对象
Save save = JsonMapper.ToObject<Save>(jsonStr);
using System.Xml;


//Xml方式
//存档
string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";
//建立XML文档
XmlDocument xmlDoc = new XmlDocument();
//建立根节点,即最上层节点
XmlElement root = xmlDoc.CreateElement("save");
//设置根节点中的值
root.SetAttribute("name", "saveFile1");
//建立XmlElement
XmlElement target;
XmlElement targetPosition;
XmlElement monsterType;
//遍历save中存储的数据,将数据转换成XML格式
for(int i = 0; i < save.livingTargetPositions.Count; i++)
{
    target = xmlDoc.CreateElement("target");
    targetPosition = xmlDoc.CreateElement("targetPosition");
    //设置InnerText值
    targetPosition.InnerText = save.livingTargetPositions[i].ToString();
    monsterType = xmlDoc.CreateElement("monsterType");
    monsterType.InnerText = save.livingMonsterTypes[i].ToString();
    //设置节点间的层级关系 root -- target -- (targetPosition, monsterType)
    target.AppendChild(targetPosition);
    target.AppendChild(monsterType);
    root.AppendChild(target);
}
//设置射击数和分数节点并设置层级关系 xmlDoc -- root --(target-- (targetPosition, monsterType), shootNum, score)
XmlElement shootNum = xmlDoc.CreateElement("shootNum");
shootNum.InnerText = save.shootNum.ToString();
root.AppendChild(shootNum);
XmlElement score = xmlDoc.CreateElement("score");
score.InnerText = save.score.ToString();
root.AppendChild(score);
xmlDoc.AppendChild(root);
xmlDoc.Save(filePath);
//读档
string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";
Save save = new Save();
//加载XML文档
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
//经过节点名称来获取元素,结果为XmlNodeList类型
XmlNodeList targets = xmlDoc.GetElementsByTagName("target");
//遍历全部的target节点,并得到子节点和子节点的InnerText
if(targets.Count != 0)
{
    foreach(XmlNode target in targets)
    {
        XmlNode targetPosition = target.ChildNodes[0];
        int targetPositionIndex = int.Parse(targetPosition.InnerText);
        //把获得的值存储到save中
        save.livingTargetPositions.Add(targetPositionIndex);

        XmlNode monsterType = target.ChildNodes[1];
        int monsterTypeIndex = int.Parse(monsterType.InnerText);
        save.livingMonsterTypes.Add(monsterTypeIndex);
    }
}
//获得存储的射击数和分数
XmlNodeList shootNum = xmlDoc.GetElementsByTagName("shootNum");
int shootNumCount = int.Parse(shootNum[0].InnerText);
save.shootNum = shootNumCount;
XmlNodeList score = xmlDoc.GetElementsByTagName("score");
int scoreCount = int.Parse(score[0].InnerText);
save.score = scoreCount;