I am getting a serialization exception error when trying to save and load in Unity?

I am attempting to save and load and it was working. The only thing I changed was attempting to save array but after that i started getting error : SerializationException: serializationStream supports seeking, but its length is 0.

My Code:

using UnityEngine;
    using System.Collections;
    using System;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
    public class GameControl : MonoBehaviour {

        public Click click;
        public GoldPerSec gps;
        public GameObject[] upgrades;
        public GameObject[] items;

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

            PlayerData data = new PlayerData ();

            data.gold = click.gold;
            data.goldperclick = click.goldperclick;
            data.clickmult = click.clickMult;
            data.gemcount = click.gems;
            data.gpsmult = gps.gpsMult;
            for (int i = 0; i < upgrades.Length; i++) {
                data.upgradesName _= upgrades*.GetComponent<UpgradeManager>().itemName;*_

data.upgradesCount = upgrades*.GetComponent ().count;*
data.upgradesCost = (int)upgrades*.GetComponent ().cost;*

}
for (int i = 0; i < items.Length; i++) {
data.managerName = items*.GetComponent().itemName;*
data.managerCount = items*.GetComponent ().count;*
data.managerCost = (int)items*.GetComponent ().cost;*

}

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

void Start()
{
if (File.Exists (Application.persistentDataPath + “/playerInfo.dat”)) {
BinaryFormatter bf = new BinaryFormatter ();
FileStream file = File.Open (Application.persistentDataPath + “/playerInfo.dat”, FileMode.Open);
PlayerData data = (PlayerData)bf.Deserialize (file);
file.Close ();

click.gold = data.gold;
click.goldperclick = data.goldperclick;
click.clickMult = data.clickmult;
click.gems = (int)data.gemcount;
gps.gpsMult = data.gpsmult;

for (int i = 0; i < upgrades.Length; i++) {
upgrades_.GetComponent().itemName = data.upgradesName*;
upgrades.GetComponent ().count = data.upgradesCount;
upgrades.GetComponent ().cost = data.upgradesCost;*_

}
for (int i = 0; i < items.Length; i++) {
items_.GetComponent().itemName = data.managerName*;
items.GetComponent ().count = data.managerCount;
items.GetComponent ().cost = data.managerCost;*_

}
}

}
}

[Serializable]
class PlayerData
{

public float gold;
public float goldperclick;
public float clickmult;
public float gemcount;
public float gpsmult;
public string[] upgradesName;
public int[] upgradesCost;
public int[] upgradesCount;
public string[] managerName;
public int[] managerCost;
public int[] managerCount;
}

Put the floats at above public click click; but below public class game control I know this sounds silly but try it it might work

If its not upgrades array then its prolly the arrays inside data. You never set them before u attempt to add to them.

This MIGHT work:

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

        PlayerData data = new PlayerData();
        
        data.gold = click.gold;
        data.goldperclick = click.goldperclick;
        data.clickmult = click.clickMult;
        data.gemcount = click.gems;
        data.gpsmult = gps.gpsMult;

        data.upgradesName = new string[upgrades.Length];
        data.upgradesCost = new int[upgrades.Length];
        data.upgradesCount = new int[upgrades.Length];

        for (int i = 0; i < upgrades.Length; i++)
        {
            data.upgradesName _= upgrades*.GetComponent<UpgradeManager>().itemName;*_

data.upgradesCount = upgrades*.GetComponent().count;*
data.upgradesCost = (int)upgrades*.GetComponent().cost;*
}

data.managerName = new string[items.Length];
data.managerCost = new int[items.Length];
data.managerCount = new int[items.Length];

for (int i = 0; i < items.Length; i++)
{
data.managerName = items*.GetComponent().itemName;*
data.managerCount = items*.GetComponent().count;*
data.managerCost = (int)items*.GetComponent().cost;*
}

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