二进制方法(Binary Formatter)
序列化:新建或打开一个二进制文件,通过二进制格式器将对象写入该二进制文件。
反序列化:打开待反序列化的二进制文件,通过二进制格式器将文件解析成对象。
class Program
{
static void Main(string[] args)
{
SaveDate savePoint = new SaveDate();
savePoint.Score = 100;
//序列化
using (FileStream fsWrite = new FileStream (@"D:\715\CSharp\1.txt",FileMode.OpenOrCreate,FileAccess.Write))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fsWrite, savePoint);
}
//反序列化
SaveDate saveRead;
using (FileStream fsRead = new FileStream (@"D:\715\CSharp\1.txt",FileMode.OpenOrCreate,FileAccess.Read))
{
BinaryFormatter bf = new BinaryFormatter();
saveRead = (SaveDate) bf.Deserialize(fsRead);
}
Console.WriteLine(saveRead.Score);
}
}
////////////////////////////////////////////////////////////
XML:扩展标记语言,用于标记电子文件使其具有结构性的标记语言。
可以用来标记数据、定义数据类型。
序列化与反序列化的方式与二进制方法十分类似。
http://blog.csdn.net/y1196645376/article/details/52541882
JSON:是一种语言无关的发送和接收数据的常用格式。可以使用它来跨平台的传输数据。
JSON序列化:对象 JSON
JSON反序列化:JSON 对象
对比
二进制方法:简单,但可读性差。
XML:可读性强,但是文件庞大,冗余信息多。
JSON:数据格式比较简单,易于读写,但是不直观,可读性比XML差
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
//二进制
private void SaveByBin()
{
//要储存的类
Save save = SaveDate();
//创建二进制序列化程序
BinaryFormatter bf = new BinaryFormatter();
//创建文件流
FileStream filestream = File.Create(Application.dataPath + "/Savemaster" + "/Bin.txt");
//用二进制序列化程序的序列化方法来序列化Save类对象,参数(文件流,需要序列化的类对象)
bf.Serialize(filestream, save);
//关闭流
filestream.Close();
if (File .Exists (Application.dataPath + "/Savemaster" + "/Bin.txt"))
{
UIManage.Instance . ShowMessage("保存成功");
}
}
private void LoadByBin()
{
if (File.Exists(Application.dataPath + "/Savemaster" + "/Bin.txt"))
{
Save save = new Save();
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = File.Open(Application.dataPath + "/Savemaster" + "/Bin.txt", FileMode.Open);
save = (Save)bf.Deserialize(fs);
fs.Close();
LoadDate(save);
//UIManage.Instance.ShowMessage("加载成功");
UIPanle.Instance.OnStartButtonDown();
}
else
UIManage.Instance.ShowMessage("无存档记录");
}
private void SaveByXML()
{
Save save = SaveDate();
//创建Xml文件存储路径
string filePath = Application .dataPath + "/Savemaster" + "/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 .livingTargetPos .Count ; i++)
{
target = xmlDoc.CreateElement("target");
targetPosition = xmlDoc.CreateElement("targetPosition");
//设置节点的值
targetPosition.InnerText = save.livingTargetPos[i].ToString();
monsterType = xmlDoc.CreateElement("monsterType");
monsterType.InnerText = save.monsterType[i].ToString();
//设置节点中的层级关系 root -- target -- (targetPosition,monsterType)
target.AppendChild(targetPosition);
target.AppendChild(monsterType);
root.AppendChild(target);
}
//设置射击数和分数节点,并设置成绩关系。root -- (target(targetPosition,monsterType) -- shootNum -- scoreNum)
XmlElement shootNum = xmlDoc.CreateElement("shootNum");
shootNum.InnerText = save.shootNum.ToString ();
root.AppendChild(shootNum);
XmlElement scoreNum = xmlDoc.CreateElement("scoreNum");
scoreNum.InnerText = save.scoreNum.ToString();
root.AppendChild(scoreNum);
//根目录添加的Xml文档
xmlDoc.AppendChild(root);
//保存Xml文档
xmlDoc.Save(filePath);
if (File.Exists(Application.dataPath + "/Savemaster" + "/byXml.txt"))
{
UIManage.Instance.ShowMessage("保存成功");
}
}
//Xml
using System.Xml;
private void LoadByXML()
{
//创建Xml文件存储路径
string filePath = Application.dataPath + "/Savemaster" + "/byXml.txt";
if (File.Exists(filePath))
{
Save save = SaveDate();
//加载Xml文档
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
//通过节点名称获取元素,结果为XmlNodeList类型
XmlNodeList targets = xmlDoc.GetElementsByTagName("target");
//遍历所有的target节点,并获得子节点和节点的InnerText
if (targets!=null)
{
foreach (XmlNode target in targets )
{
XmlNode targetPosition = target.ChildNodes[0];
int targetPositionIndex =int.Parse ( targetPosition.InnerText);
//把得到的值存到save中
save.livingTargetPos.Add(targetPositionIndex);
XmlNode monsterType = target.ChildNodes[1];
int monsterTypeIndex = int.Parse(monsterType.InnerText);
//把得到的值存到save中
save.monsterType.Add(monsterTypeIndex);
}
}
//得到存储的射击数和分数。
XmlNodeList shootNum = xmlDoc.GetElementsByTagName("shootNum");
int shootNumCount = int.Parse (shootNum[0].InnerText);
save.shootNum = shootNumCount;
XmlNodeList scoreNum = xmlDoc.GetElementsByTagName("scoreNum");
int scoreNumCount = int.Parse(scoreNum[0].InnerText);
save.scoreNum = scoreNumCount;
LoadDate(save);
UIPanle.Instance.OnStartButtonDown();
}
else
UIManage.Instance.ShowMessage("无存档记录");
}
using LitJson;
//Json
private void SaveByJson()
{
Save save = SaveDate();
//路径
string filePath = Application.dataPath + "/Savemaster" + "/ByJson.json";
//利用JsonMapper将save对象转换为Json字符串
string saveJsonMapper = JsonMapper.ToJson(save);
//创建StreamWriter,并将字符串写入文件
StreamWriter sw = new StreamWriter(filePath);
sw.Write(saveJsonMapper);
//关闭StreamWriter
sw.Close();
UIManage.Instance.ShowMessage("保存成功");
}
private void LoadByJson()
{
string filePath = Application.dataPath + "/Savemaster" + "/ByJson.json";
if(File .Exists (filePath ))
{
//创建StreamReader,读取流
StreamReader sr = new StreamReader(filePath);
//读取流赋值给jsonStr,并关闭流
string jsonStr = sr.ReadToEnd();
sr.Close();
//将jsonStr转换为对象
Save save = JsonMapper.ToObject<Save>(jsonStr);
LoadDate(save);
UIPanle.Instance.OnStartButtonDown();
}
else
{
UIManage.Instance.ShowMessage("无存档记录");
}
}