binaryformatter android save and load not working

I’ve tested on the editor and it works fine.But on Android doesnt work. Here’s the code.

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

public class SaveData
{
    public static int playerMoney;
    public static int playerBankMoney;
    public static int playerHealth;
    public static int playerHunger;
}


public class SaveLoadSystem
{
    public static void Save()
    {
        BinaryFormatter bf = new BinaryFormatter();
        string path = Path.Combine(Application.persistentDataPath, "player.bin");
        using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
        {
            bf.Serialize(fs, SaveData.playerMoney);
            bf.Serialize(fs, SaveData.playerBankMoney);
            bf.Serialize(fs, SaveData.playerHealth);
            bf.Serialize(fs, SaveData.playerHunger);

            fs.Close();          
        }
        
    }

    public static void Load()
    {
        if (!File.Exists("player.bin"))
            return;

        BinaryFormatter bf = new BinaryFormatter();
        string path = Path.Combine(Application.persistentDataPath, "player.bin");
        using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            SaveData.playerMoney = (int)bf.Deserialize(fs);
            SaveData.playerBankMoney = (int)bf.Deserialize(fs);
            SaveData.playerHealth = (int)bf.Deserialize(fs);
            SaveData.playerHunger = (int)bf.Deserialize(fs);

            fs.Close();
        }
    }
}
  1. Remove static keywords from SaveData class’ fields.
  2. Add [System.Serializable] attribute for SaveData class.
  3. Both your serialization and deserialization code looks fishy.

Replace whatever this is:

SaveData.playerMoney = (int)bf.Deserialize(fs);
SaveData.playerBankMoney = (int)bf.Deserialize(fs);
SaveData.playerHealth = (int)bf.Deserialize(fs);
SaveData.playerHunger = (int)bf.Deserialize(fs);

with:

SaveData saveData = (SaveData) bf.Deserialize(fs);

Also:

bf.Serialize( fs , saveData );

_
Note: You don’t need BinaryFormatter to serialize a int field.

var bytes = System.BitConverter.GetBytes( SaveData.playerMoney );

will do.

Shouldn’t you use File.Exists with the full path as the parameter?

string path = Path.Combine(Application.persistentDataPath, "player.bin");

if(!File.Exists(path))
   return;

I just change Path.Combine(Application.persistentDataPath, "player.bin"); to Application.persistentDataPath + "/player.bin"; and it works on great.