公有数据类-序列化存储

139 阅读1分钟

在幻径游戏中使用序列化和反序列化存储了一个单机的小游戏

在类前写上[System.Serializable]

GameData类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 序列化和反序列化
/// </summary>
[System.Serializable]
public class GameData
{
    /// <summary>
    /// 是否是重新开始游戏
    /// </summary>
    public static bool isAgainGame = false;

    private bool isFirstGame;//第一次开始游戏
    private bool isMusicOn;//当前音效是否开
    private int[] bestScoreArr;//当前排名  -前三名
    private int selectSkin;//当前选择皮肤
    private bool[] skinUnlocked;//未解锁的皮肤
    private int diamondcount;//钻石数量

    public void SetIsFitstGame(bool isFirstGame) 
    {
        this.isFirstGame = isFirstGame;
    }
    public void SetIsMusicOn(bool isMusicOn)
    {
        this.isMusicOn = isMusicOn;
    }
    public void SetBestScoreArr(int[] bestScoreArr)
    {
        this.bestScoreArr = bestScoreArr;
    }
    public void SetSelectSkin(int selectSkin)
    {
        this.selectSkin = selectSkin;
    }
    public void SetSkinUnlocked(bool[] skinUnlocked)
    {
        this.skinUnlocked = skinUnlocked;

    }
    public void SetDiamondcount(int diamondcount)
    {
        this.diamondcount = diamondcount;
    }
    public bool GetIsFitstGame()
    {
       return isFirstGame;
    }
    public bool GetIsMusicOn()
    {
        return isMusicOn;
    }
    public int[] GetBestScoreArr()
    {
        return bestScoreArr;
    }
    public int GetSelectSkin()
    {
        return selectSkin;
    }
    public bool[] GetSkinUnlocked()
    {
        return skinUnlocked;

    }
    public int GetDiamondcount()
    {
       return diamondcount;
    }
}

在脚本类中调用 定义private GameData data;,拿到这个类data = new GameData(); 使用序列化BinaryFormatter需要引用一下命名空间using System.Runtime.Serialization.Formatters.Binary; 创建文件的写入流

  • BinaryFormatter序列化方式,就是给Book类赋值,然后进行序列化到临时存放Application.persistentDataPath到一个新建的文件中File.Create,using可以让文件流自动释放 使用方式
FileStream fs=File.Create(Application.persistentDataPath+ "/GameData.data")
fs.close();

将流放入序列化存入数据 bf.Serialize(fs,data); 需要将GameData数据中的属性在此类设置一下,拿过来放到data

  • file.OpenReal打开,反序列化解析成类,json转成类data=(GameData)bf.Deserialize(fs);
  • 完整代码
  /// <summary>
    /// 数据存储
    /// 
    /// 文件流 引入system.IO
    /// 
    /// </summary>
    private void Save() 
    {
        try
        {
            BinaryFormatter bf = new BinaryFormatter();
            //创建文件的写入流  自动释放fs.close
            using (FileStream fs=File.Create(Application.persistentDataPath+ "/GameData.data"))
            {
                //拿到数据集中的字段,放到data中
                data.SetBestScoreArr(bestScoreArr);
                data.SetDiamondcount(diamondcount);
                data.SetIsFitstGame(isFirstGame);
                data.SetIsMusicOn(isMusicOn);
                data.SetSelectSkin(selectSkin);
                data.SetSkinUnlocked(skinUnlocked);

                //写入本地
                bf.Serialize(fs,data);//序列化
            }
        }
        catch (System.Exception e)
        {
            Debug.Log(e.Message);
        }
    }
    /// <summary>
    /// 读取
    /// </summary>
    private void Read()
    {
        try
        {
            BinaryFormatter bf = new BinaryFormatter();
            using (FileStream fs=File.Open(Application.persistentDataPath + "/GameData.data", FileMode.Open))
            {
                data=(GameData)bf.Deserialize(fs);//反序列化  返回值object
            }
        }
        catch (System.Exception e)
        {
            Debug.Log(e.Message);
        }
    }