二进制方法(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("无存档记录");
    }
}