存储数据方式主要有二进制、json、xml三种
原理都是 储存->数据序列化成字节流->存入文件(txt,json,xml)
读取->字节流反序列化成数据->赋值给项目中专用来储存这些的对象
1.二进制
用二进制首先需要2个包,unity已经自己有,不用下,直接脚本写就行了
using System.IO; //文件流filestream
using System.Runtime.Serialization.Formatters.Binary;//使用二进制需引用的
存储
1.创建一个含有当前游戏信息的一个对象
例:
//创建save对象,并得到当前游戏信息
TheSave save = CreateSaveObject();
2.创建一个二进制格式化程序
例:
//创建一个二进制格式化程序-bf
BinaryFormatter bf = new BinaryFormatter();
3.创建一个文件流
例:
//创建一个文件流
FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile" + "/byBin.txt");
4.用二进制格式化程序来序列化save对象
//用二进制格式化程序来序列化save对象-参数(文件流,序列化对象)
bf.Serialize(fileStream, save);
5.关闭
//关闭流
fileStream.Close();
读取
1.//创建一个二进制格式化程序
BinaryFormatter bf = new BinaryFormatter();
2.打开一个文件流
//打开一个文件流
FileStream fileStream = File.Open(Application.dataPath + "/StreamingFile" + "/byBin.txt", FileMode.Open);
3. //用二进制格式化程序的反序列方法,来将文件流转换为save对象
//用二进制格式化程序的反序列方法,来将文件流转换为save对象
TheSave save = (TheSave)bf.Deserialize(fileStream);
4.关闭文件流
//关闭文件流
fileStream.Close();
5.读取完得到储存游戏信息的对象save后,编写一个函数来让save里的数据代替现在的数据
SetGame(save);
总体
//二进制方法
private void SaveByBin()
{
//序列化过程-将save对象转换为字节流
//创建save对象,并得到当前游戏信息
TheSave save = CreateSaveObject();
//创建一个二进制格式化程序-bf
BinaryFormatter bf = new BinaryFormatter();
//创建一个文件流
FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile" + "/byBin.txt");
//用二进制格式化程序来序列化save对象-参数(文件流,序列化对象)
bf.Serialize(fileStream, save);
//关闭流
fileStream.Close();
}
private void LoadByBin()
{
if (File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt"))
{
//反序列化过程
//创建一个二进制格式化程序
BinaryFormatter bf = new BinaryFormatter();
//打开一个文件流
FileStream fileStream = File.Open(Application.dataPath + "/StreamingFile" + "/byBin.txt", FileMode.Open);
//用二进制格式化程序的反序列方法,来将文件流转换为save对象
TheSave save = (TheSave)bf.Deserialize(fileStream);
//关闭文件流
fileStream.Close();
SetGame(save);
}
}
2.json
json用到了外部的包,具体网上找,名字就是LitJson,但用这个需注意编码问题,有中文(生成json)不能直接存
using LitJson; //json
存储
1.还是一个有游戏信息的对象
TheSave save = CreateSaveObject();
2.定义一个string路径
string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json"; //.txt和.json都可以
3.利用litjson自带的函数将Save对象转换为json格式的字符串
//利用litjson自带的函数将Save对象转换为json格式的字符串
string saveJsonStr = JsonMapper.ToJson(save);
4.创建一个json的StreamWritter
//创建一个StreamWritter
StreamWriter sw = new StreamWriter(filePath);//创建文件
5.将json字符串写入文件
sw.Write(saveJsonStr);//写入文件
6.关闭StreamWritter
sw.Close();
读取
1.创建路径字符串
string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";
2.创建一个StreamReader
//创建一个StreamReader
StringReader sr = new StringReader(filePath);
3. 将读取到的流赋值给jsonstr
//将读取到的流赋值给jsonstr
string saveJsonStr = sr.ReadToEnd();
4.将字符串jsonstr转换为save对象
//将字符串jsonstr转换为save对象
TheSave save = JsonMapper.ToObject<TheSave>(saveJsonStr);
5.关闭
//关闭
sr.Close();
总体
//Json方法
private void SaveByJson()
{
TheSave save = CreateSaveObject();
string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json"; //.txt和.json都可以
//利用litjson自带的函数将Save对象转换为json格式的字符串
string saveJsonStr = JsonMapper.ToJson(save);
//将json字符串写入文件
//创建一个StreamWritter
StreamWriter sw = new StreamWriter(filePath);//创建文件
sw.Write(saveJsonStr);//写入文件
//关闭StreamWritter
sw.Close();
}
private void LoadByJson()
{
string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";
if (File.Exists(filePath))
{
//创建一个StreamReader
StringReader sr = new StringReader(filePath);
//将读取到的流赋值给jsonstr
string saveJsonStr = sr.ReadToEnd();
Debug.Log(saveJsonStr);
//将字符串jsonstr转换为save对象
TheSave save = JsonMapper.ToObject<TheSave>(saveJsonStr);
//关闭
sr.Close();
SetGame(save);
}
}
总结来说:
二进制:
储存:得到对象->创二进制格式化程序->创建一个文件流->用二进制格式化程序来序列化对象->关闭
读取:创二进制格式化程序->打开一个文件流->二进制格式化程序的反序列方法将文件流转换对象->关闭->用对象更新游戏数据
Json:
:储存:得到对象->创字符串路径->自带的函数JsonMapper.tojson(对象)-转换为json格式->创建一个StreamWritter->写入文件->关闭
读取:创字符串路径->创建一个StreamReader->读取sr.ReadToEnd();赋值给字符串->将字符串jsonstr转换为对象JsonMapper.ToObject<对象>(字符串) ->关闭->用对象更新游戏数据