.data serialize and deserialize work in editor but not in build
Hello world!
First and foremost, please assume I'm a cavesman. I tried to make my script as simple as possible, because I'm quite the beginner at this, and I'd be ever-so-grateful for a simple, easily comprehensible answer.
So here's the deal : I've created a custom class (ActorData) that I use to store all information pertaining to instantiatable characters in game (the player may create/edit/delete actors at will in a menu).
I then save the current actors in a list that I save in .data format. (tried XML, but couldn't find a tutorial clear and explicit enough for me).
The whole process works flawlessly in the editor, but the list itself, when in a build, simply dosen't get loaded at all! I honestly don't get what's happening.
Here's the problematic code:
using UnityEngine;
using System.Collections;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using UnityEngine.UI;
using System.Collections.Generic;
public class ActorSaveAndLoad : MonoBehaviour {
public void SaveActorData (List <ActorData> Data) {
BinaryFormatter bf = new BinaryFormatter ();
FileStream file = File.Create (Application.dataPath + "/Resources/Data/Object Information/Figurines/FigData.dat");
bf.Serialize (file, Data);
file.Close ();
}
public List<ActorData> LoadActorData () {
List<ActorData> data;
if (File.Exists (Application.dataPath + "/Resources/Data/Object Information/Figurines/FigData.dat")){
BinaryFormatter bf = new BinaryFormatter ();
FileStream file = File.Open (Application.dataPath + "/Resources/Data/Object Information/Figurines/FigData.dat", FileMode.Open);
data = (List<ActorData>)bf.Deserialize (file) as List<ActorData>;
file.Close ();
} else {
data = null;
}
if (GameObject.Find("TestText").gameObject && data != null) {
GameObject.Find ("TestText").gameObject.GetComponent<Text> ().text = ("data contains "+data.Count+" objects");
} else if (GameObject.Find("TestText").gameObject && data == null) {
GameObject.Find ("TestText").gameObject.GetComponent<Text> ().text = ("data ain't here!");
}
return data;
}
}
[Serializable]
public class ActorData {
public string ActorName;
public bool IsPlayer;
public string PlayerName;
public bool IsHostile;
public bool UseQuickHP;
public int MinHP;
public int MaxHP;
public string ActorNotes;
public float ActorSize;
public string FigModelName;
public String PedModelName;
public ActorData (string name, bool player, string pName, bool hostile, bool quickHP, int minHP, int maxHP, string notes, float size, string figName, string pedName) {
ActorName = name;
IsPlayer = player;
if (IsPlayer) {
PlayerName = pName;
} else {
PlayerName = null;
}
IsHostile = hostile;
UseQuickHP = quickHP;
MinHP = minHP;
MaxHP = maxHP;
ActorNotes = notes;
ActorSize = size;
FigModelName = figName;
PedModelName = pedName;
}
in a build, this simply throws a NullReferenceException whenever the list is called by another script.
Does anyone know how to fix this?
Answer by Allchemyst · Aug 27, 2016 at 08:26 PM
Nevermind, fixed it myself.
Changed the Datapath to :
Application.persistentDataPath + "FigData.dat"
and suddenly the build was able to find it.