Loading and Saving error

Hi,

I recently followed the online tutorial step by step on how to save and load data using serialization, once I completed it and ran it (I have a button to save and a button to load) when the save button is pressed I can easily get to the file and see that in fact all the data has saved but when I try to load it again nothing happens all the data is once again reset to default values, the full code is below and I would really appreciate it if you could help in any way.

Code:

using UnityEngine;
using System.Collections;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using UnityEngine.UI;



[Serializable]
public class Services
{
    public string name;
    public int noUnits;
    public int avalUnits;
    public string fundingLevel;
    public int level;

    public Services()
    {
        name = "Police";
        noUnits = 1;
        avalUnits = 1;
        fundingLevel = "unassigned";
        level = 1;
    }

}
[Serializable]
public class Missions
{
    public int difficulty;
    public bool police;
    public bool fire;
    public bool rescue;
    public int p_units;
    public int f_units;
    public int r_units;
    public double baseChance;
    public double totalChance;
    public int payOutAmount;
    public int unitsLost;
    public bool missionUndertaken;
    public bool MissionWon;
    public double result;

    public Missions()
    {
        difficulty = 1;
        police = true;
        fire = true;
        rescue = true;
        p_units = 0;
        f_units = 0;
        r_units = 0;
        baseChance = 0.5000;
        totalChance = 0.5000;
        payOutAmount = 50;
        unitsLost = 0;
        missionUndertaken = true;
        MissionWon = true;
    }
};

[Serializable]
public class Game
{
    public int money;
    public string time;
    public string date;
    public int missionsComplete;
    public bool gamePaused;
    public bool gameLost;
    public bool tutorials;

    public Services p = new Services();
    public Services f = new Services();
    public Services r = new Services();

    public Missions m1 = new Missions();
    public Missions m2 = new Missions();
    public Missions m3 = new Missions();
    public Missions m4 = new Missions();
    public Missions m5 = new Missions();

    public Game()
    {
        money = 50;
        time = "12:00";
        date = "1st January 2016";
        missionsComplete = 0;
        gamePaused = false;
        gameLost = false;
        tutorials = true;

        p.name = "Police";
        p.noUnits = 1;
        p.avalUnits = 1;
        p.fundingLevel = "Good";
        p.level = 1;

        f.name = "Fire";
        f.noUnits = 1;
        f.avalUnits = 1;
        f.fundingLevel = "Good";
        f.level = 1;

        r.name = "Fire";
        r.noUnits = 1;
        r.avalUnits = 1;
        r.fundingLevel = "Good";
        r.level = 1;

        m1.difficulty = 1;
        m1.police = true;
        m1.fire = false;
        m1.rescue = false;
        m1.p_units = 0;
        m1.f_units = 0;
        m1.r_units = 0;
        m1.baseChance = 1.0;
        m1.totalChance = 1.0;
        m1.payOutAmount = 50;
        m1.unitsLost = 0;
        m1.missionUndertaken = false;
        m1.MissionWon = false;

        m2.difficulty = 2;
        m2.police = true;
        m2.fire = true;
        m2.rescue = false;
        m2.p_units = 0;
        m2.f_units = 0;
        m2.r_units = 0;
        m2.baseChance = 0.55;
        m2.totalChance = 0.6;
        m2.payOutAmount = 75;
        m2.unitsLost = 0;
        m2.missionUndertaken = false;
        m2.MissionWon = false;

        m3.difficulty = 3;
        m3.police = true;
        m3.fire = true;
        m3.rescue = false;
        m3.p_units = 0;
        m3.f_units = 0;
        m3.r_units = 0;
        m3.baseChance = 0.5;
        m3.totalChance = 0.6;
        m3.payOutAmount = 100;
        m3.unitsLost = 0;
        m3.missionUndertaken = false;
        m3.MissionWon = false;

        m4.difficulty = 4;
        m4.police = true;
        m4.fire = true;
        m4.rescue = false;
        m4.p_units = 0;
        m4.f_units = 0;
        m4.r_units = 0;
        m4.baseChance = 0.45;
        m4.totalChance = 0.6;
        m4.payOutAmount = 125;
        m4.unitsLost = 0;
        m4.missionUndertaken = false;
        m4.MissionWon = false;

        m5.difficulty = 5;
        m5.police = true;
        m5.fire = true;
        m5.rescue = false;
        m5.p_units = 0;
        m5.f_units = 0;
        m5.r_units = 0;
        m5.baseChance = 0.4;
        m5.totalChance = 0.6;
        m5.payOutAmount = 150;
        m5.unitsLost = 0;
        m5.missionUndertaken = false;
        m5.MissionWon = false;
    }
};
[Serializable]
public class Chance : MonoBehaviour
{

    public Text moneyText;
    public Text timeText;
    public Text dateText;

    public Text pUnitsText;
    public Text fUnitsText;
    public Text rUnitsText;

    public Text pAvalUnitsText;
    public Text fAvalUnitsText;
    public Text rAvalUnitsText;

    public Text pFundingText;
    public Text fFundingText;
    public Text rFundingText;

    public Canvas tutorialCanvas;
    public Canvas pUpgradeCanvas;
    public Canvas fUpgradeCanvas;
    public Canvas rUpgradeCanvas;
    public Canvas noMoneyCanvas;
    public Canvas noUnitsCanvas;

    public Game game;


    public void Awake()
    {
        game = new Game();
    }

    // Use this for initialization
    public void Start()
    {
        moneyText.text = "£" + game.money.ToString();
        timeText.text = game.time.ToString();
        dateText.text = game.date.ToString();
        pUnitsText.text = "No. of units: " + game.p.noUnits.ToString();
        fUnitsText.text = "No. of units: " + game.f.noUnits.ToString();
        rUnitsText.text = "No. of units: " + game.r.noUnits.ToString();

        pAvalUnitsText.text = "Available units:  " + game.p.avalUnits.ToString();
        fAvalUnitsText.text = "Available units:  " + game.f.avalUnits.ToString();
        rAvalUnitsText.text = "Available units:  " + game.r.avalUnits.ToString();

        pFundingText.text = "Funding Level:  " + game.p.fundingLevel.ToString();
        fFundingText.text = "Funding Level:  " + game.p.fundingLevel.ToString();
        rFundingText.text = "Funding Level:  " + game.p.fundingLevel.ToString();

    }

    public void pPlus()
    {
        if (game.money >= 50)
        {
            game.p.noUnits = game.p.noUnits + 1;
            pUnitsText.text = "No. Of Units " + game.p.noUnits.ToString();
            game.p.avalUnits = game.p.avalUnits + 1;
            pAvalUnitsText.text = "Available units  " + game.p.avalUnits.ToString();
            game.money = game.money - 50;
            moneyText.text = "£" + game.money.ToString();
        }

        else
        {
            noMoneyCanvas.enabled = true;
        }
    }

    public void pMinus()
    {
        if (game.p.noUnits >= 1)
        {
            game.p.noUnits = game.p.noUnits - 1;
            pUnitsText.text = "No. Of Units " + game.p.noUnits.ToString();
            game.p.avalUnits = game.p.avalUnits - 1;
            pAvalUnitsText.text = "Available units  " + game.p.avalUnits.ToString();
            game.money = game.money + 50;
            moneyText.text = "£" + game.money.ToString();
        }

        if (game.p.noUnits < 0)
        {
            game.p.noUnits = 0;
            game.p.avalUnits = 0;
            noUnitsCanvas.enabled = true;
        }
    }

    public void fPlus()
    {
        if (game.money >= 50)
        {
            game.f.noUnits = game.f.noUnits + 1;
            fUnitsText.text = "No. Of Units " + game.f.noUnits.ToString();
            game.f.avalUnits = game.f.avalUnits + 1;
            fAvalUnitsText.text = "Available units  " + game.f.avalUnits.ToString();
            game.money = game.money - 50;
            moneyText.text = "£" + game.money.ToString();
        }

        else
        {
            noMoneyCanvas.enabled = true;
        }
    }

    public void fMinus()
    {
        if (game.f.noUnits >= 1)
        {
            game.f.noUnits = game.f.noUnits - 1;
            fUnitsText.text = "No. Of Units " + game.f.noUnits.ToString();
            game.f.avalUnits = game.f.avalUnits - 1;
            fAvalUnitsText.text = "Available units  " + game.f.avalUnits.ToString();
            game.money = game.money + 50;
            moneyText.text = "£" + game.money.ToString();
        }

        if (game.f.noUnits < 0)
        {
            game.f.noUnits = 0;
            game.f.avalUnits = 0;
            noUnitsCanvas.enabled = true;
        }
    }

    public void rPlus()
    {
        if (game.money >= 50)
        {
            game.r.noUnits = game.r.noUnits + 1;
            rUnitsText.text = "No. Of Units " + game.r.noUnits.ToString();
            game.r.avalUnits = game.r.avalUnits + 1;
            rAvalUnitsText.text = "Available units  " + game.r.avalUnits.ToString();
            game.money = game.money - 50;
            moneyText.text = "£" + game.money.ToString();
        }

        else
        {
            noMoneyCanvas.enabled = true;
        }
    }

    public void rMinus()
    {
        if (game.r.noUnits >= 1)
        {
            game.r.noUnits = game.r.noUnits - 1;
            rUnitsText.text = "No. Of Units " + game.r.noUnits.ToString();
            game.r.avalUnits = game.r.avalUnits - 1;
            rAvalUnitsText.text = "Available units  " + game.r.avalUnits.ToString();
            game.money = game.money + 50;
            moneyText.text = "£" + game.money.ToString();
        }

        if (game.r.noUnits < 0)
        {
            game.r.noUnits = 0;
            game.r.avalUnits = 0;
            noUnitsCanvas.enabled = true;
        }
    }

    public void Save()
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create(Application.persistentDataPath + "/pss_data.dat");

        PlayerData data = new PlayerData();
        data.money = game.money;
        data.time = game.time;
        data.missionsComplete = game.missionsComplete;
        data.gameLost = game.gameLost;
        data.tutorials = game.tutorials;
        data.p_noUnits = game.p.noUnits;
        data.p_avalUnits = game.p.avalUnits;
        data.p_fundingLevel = game.p.fundingLevel;
        data.p_level = game.p.level;
        data.f_noUnits = game.f.noUnits;
        data.f_avalUnits = game.f.avalUnits;
        data.f_fundingLevel = game.f.fundingLevel;
        data.f_level = game.f.level;
        data.r_noUnits = game.r.noUnits;
        data.r_avalUnits = game.r.avalUnits;
        data.r_fundingLevel = game.r.fundingLevel;
        data.r_level = game.r.level;

        bf.Serialize(file, data);
        file.Close();
    }

    public void Load()
    {
        if (File.Exists(Application.persistentDataPath + "/pss_data.dat"))
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/pss_data.dat", FileMode.Open);
            PlayerData data = (PlayerData)bf.Deserialize(file);
            file.Close();

            game.money = data.money;
            game.date = data.date;
            game.missionsComplete = data.missionsComplete;
            game.gameLost = data.gameLost;
            game.tutorials = data.tutorials;

            game.p.noUnits = data.p_noUnits;
            game.p.avalUnits = data.p_avalUnits;
            game.p.fundingLevel = data.p_fundingLevel;
            game.p.level = data.p_level;

            game.f.noUnits = data.f_noUnits;
            game.f.avalUnits = data.f_avalUnits;
            game.f.fundingLevel = data.f_fundingLevel;
            game.f.level = data.f_level;

            game.r.noUnits = data.r_noUnits;
            game.r.avalUnits = data.r_avalUnits;
            game.r.fundingLevel = data.r_fundingLevel;
            game.r.level = data.r_level;

        }

    }

    [Serializable]
    class PlayerData
    {
        public int money;
        public string time;
        public string date;
        public int missionsComplete;
        public bool gameLost;
        public bool tutorials;

        public int p_noUnits;
        public int p_avalUnits;
        public string p_fundingLevel;
        public int p_level;

        public int f_noUnits;
        public int f_avalUnits;
        public string f_fundingLevel;
        public int f_level;

        public int r_noUnits;
        public int r_avalUnits;
        public string r_fundingLevel;
        public int r_level;
    }



    // Update is called once per frame
    void Update()
    {
        Canvas.ForceUpdateCanvases();
    }
}

Just to help out a little more I added debug code at the end of save and load both appear in my debugger as being complete.

I have attached my serialized file (purely because it doesn’t look right to me)