Q:

Saving and Loading Game Data Not Working

Not sure why my code isn't working as I've followed examples I've found. Trying to get my iOS game to save and load data back using Unity3D but not using the player.prefs.
On the scene's I have this
void OnDisable(){
    GameController.Save ();
}

void OnEable(){
    GameController.Load ();
}

Game Controller is a static method.. 
static public void Save()
    {
        Debug.Log("Saving Player Data...");
        print ("Saving Player Data...");
        var bf = new BinaryFormatter();
        var file = File.Create(Application.persistentDataPath + "/CatEscapeInfo.dat");

        var data = new PlayerData
        {
            PlayerLives = PlayerLives,
            Score = Score,
            Distance = Distance,
            CurrentLevelNo = CurrentLevelNo,
            HighestLevelCompleted = HighestLevelCompleted
        };

        bf.Serialize(file, data);
        file.Close();
        //PlayerPrefs.SetString (data);
        Debug.Log ("Player Data Saved: " + PlayerLives + ", " + Score);
        print ("Player Data Saved: " + PlayerLives + ", " + Score);
    }

    static public void Load()
    {
        Debug.Log("Loading Player Data...");
        if (File.Exists(Application.persistentDataPath + "/CatEscapeInfo.dat"))
        {
            var bf = new BinaryFormatter();
            var file = File.Open(Application.persistentDataPath + "/CatEscapeInfo.dat", FileMode.Open);
            var data = bf.Deserialize(file) as PlayerData;
            file.Close();

            Debug.Log("Player Data Loaded: " + data.PlayerLives + ", " + data.Score);
            print ("Player Data Loaded: " + data.PlayerLives + ", " + data.Score);

            if (data != null)
            {
                PlayerLives = data.PlayerLives;
                Score = data.Score;
                Distance = data.Distance;
                CurrentLevelNo = data.CurrentLevelNo;
                HighestLevelCompleted = data.HighestLevelCompleted;
            }
        }
    }

Even though I have this code running, when I manually close the game on iOS and bring it back up it never loads the game back to the stats it had. 
 Any thoughts? Am I missing something?
Update:
In iOS XCode, I find it's spitting out this stack trace when trying to "Load" though at the this point the file doesn't exist yet.
On Loading This is Stack Trace:
> (Filename:
> /Applications/buildAgent/work/d63dfc6385190b60/artifacts/iPhonePlayer-armv7Generated/UnityEngineDebug.cpp
> Line: 49)
> 
> SerializationException: Unexpected binary element: 255   at
> System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject
> (BinaryElement element, System.IO.BinaryReader reader, System.Int64&
> objectId, System.Object& value,
> System.Runtime.Serialization.SerializationInfo& info) [0x00000] in
> <filename unknown>:0    at
> System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject
> (BinaryElement element, System.IO.BinaryReader reader) [0x00000] in
> <filename unknown>:0    at
> System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph
> (BinaryElement elem, System.IO.BinaryReader reader, Boolean
> readHeaders, System.Object& result,
> System.Runtime.Remoting.Messaging.Header[]& headers) [0x00000] in
> <filename unknown>:0    at
> System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize
> (System.IO.Stream serializationStream,
> System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x00000] in
> <filename unknown>:0    at
> System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
> (System.IO.Stream serializationStream) [0x00000] in <filename
> unknown>:0    at GameController.Load () [0x00000] in <filename
> unknown>:0    at GameController.OnEnable () [0x00000] in <filename
> unknown>:0    (Filename:  Line: -1)

On Saving, This is Stack Trace:
> Saving Player Data... UnityEngine.Debug:Internal_Log(Int32, String,
> Object) UnityEngine.Debug:Log(Object)
> UnityEngine.MonoBehaviour:print(Object) GameController:Save()
> GameController:OnDisable() UnityEngine.Object:Destroy(Object, Single)
> UnityEngine.Object:Destroy(Object) GameController:Awake()   (Filename:
> /Applications/buildAgent/work/d63dfc6385190b60/artifacts/iPhonePlayer-armv7Generated/UnityEngineDebug.cpp
> Line: 49)
> 
> ExecutionEngineException: Attempting to JIT compile method
> 'PlayerData__TypeMetadata4:.ctor ()' while running with --aot-only.
> 
>   at System.Reflection.MonoCMethod.Invoke (System.Object obj,
> BindingFlags invokeAttr, System.Reflection.Binder binder,
> System.Object[] parameters, System.Globalization.CultureInfo culture)
> [0x00000] in <filename unknown>:0  Rethrow as
> TargetInvocationException: Exception has been thrown by the target of
> an invocation.   at System.Reflection.MonoCMethod.Invoke
> (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder
> binder, System.Object[] parameters, System.Globalization.CultureInfo
> culture) [0x00000] in <filename unknown>:0    at
> System.Reflection.MonoCMethod.Invoke (BindingFlags invokeAttr,
> System.Reflection.Binder binder, System.Object[] parameters,
> System.Globalization.CultureInfo culture) [0x00000] in <filename
> unknown>:0    at System.Reflection.ConstructorInfo.Invoke
> (System.Object[] parameters) [0x00000] in <filename unknown>:0    at
> System.Activator.CreateInstance (System.Type type, Boolean nonPublic)
> [0x00000] in <filename unknown>:0    at
> System.Activator.CreateInstance (System.Type type) [0x00000] in
> <filename unknown>:0    at
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.CreateMemberTypeMetadata
> (System.Type type) [0x00000] in <filename unknown>:0    at
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.GetObjectData
> (System.Object obj,
> System.Runtime.Serialization.Formatters.Binary.TypeMetadata& metadata,
> System.Object& data) [0x00000] in <filename unknown>:0    at
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObject
> (System.IO.BinaryWriter writer, Int64 id, System.Object obj) [0x00000]
> in <filename unknown>:0    at
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectInstance
> (System.IO.BinaryWriter writer, System.Object obj, Boolean
> isValueObject) [0x00000] in <filename unknown>:0    at
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteQueuedObjects
> (System.IO.BinaryWriter writer) [0x00000] in <filename unknown>:0   
> at
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectGraph
> (System.IO.BinaryWriter writer, System.Object obj,
> System.Runtime.Remoting.Messaging.Header[] headers) [0x00000] in
> <filename unknown>:0    at
> System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize
> (System.IO.Stream serializationStream, System.Object graph,
> System.Runtime.Remoting.Messaging.Header[] headers) [0x00000] in
> <filename unknown>:0    at
> System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize
> (System.IO.Stream serializationStream, System.Object graph) [0x00000]
> in <filename unknown>:0    at GameController.Save () [0x00000] in
> <filename unknown>:0    at GameController.OnDisable () [0x00000] in
> <filename unknown>:0  UnityEngine.Object:Destroy(Object, Single)
> UnityEngine.Object:Destroy(Object) GameController:Awake()

A:

Put this code to Awake or Start funtion in your scene script:
// Forces a different code path in the BinaryFormatter that doesn't rely on run-time code generation (which would break on iOS).
Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");

By default Mono binary-serializer uses JIT-compilation which is unsupported by iOS. Fortunately, there is a way (the code above) to switch it to use reflection instead.
Proof / See also:

http://answers.unity3d.com/questions/725419/filestream-binaryformatter-from-c-to-ios-doesnt-wo.html
http://answers.unity3d.com/questions/30930/why-did-my-binaryserialzer-stop-working.html

