Cannot save(serialize) a double array of a custom class

I can save and access an array of the custom data type, I can also access the double array of built in types such as int, but the double array of my custom type gives an " object reference not set to an instance of an object" error message in the line “bF.Serialize(file, data);”. although all three object references are instantiated.

I can easily work around this, but that would result in less clean code, I could for example make a second custom class which houses the double array, which resolves the problem. I, however would like to know why my code isn’t working as expected.

For clarification: Double array of int:

public int[] arr1;
    public int[] arr2;
    void Save() {
        BinaryFormatter bF = new BinaryFormatter();
        FileStream file = File.Open(Application.persistentDataPath + "/data.dat", FileMode.Create);
        int[][] data = new int[2][];
        data[0] = new int[] { 1, 2, 3 };
        data[1] = new int[] { 4, 5 };
        bF.Serialize(file, data);
        file.Close();
    }
    void Load() {
        BinaryFormatter bF = new BinaryFormatter();
        FileStream file = File.Open(Application.persistentDataPath + "/data.dat", FileMode.Open);
        int[][] data = (int[][])bF.Deserialize(file);
        file.Close();
        arr1 = data[0];
        arr2 = data[1];
    }

Works like a charm.

  • array of custom class:

     void Save() {
             BinaryFormatter bF = new BinaryFormatter();
             FileStream file = File.Open(Application.persistentDataPath + "/data.dat", FileMode.Create);
             CustomClass[] data = new CustomClass[]{new CustomClass(1), new CustomClass(2), new CustomClass(3)};
             bF.Serialize(file, data);
             file.Close();
         }
         void Load() {
             BinaryFormatter bF = new BinaryFormatter();
             FileStream file = File.Open(Application.persistentDataPath + "/data.dat", FileMode.Open);
             CustomClass[] data = (CustomClass[])bF.Deserialize(file);
             file.Close();
             arr1 = data;
         }
    

No problems here

  • Double array of custom class:

     public CustomClass[] arr1;
     public CustomClass[] arr2;
     [System.Serializable]
         public class CustomClass {
             public CustomClass(int i) {
                 integer = i;
             }
             public int integer;
         }
     void Save() {
             BinaryFormatter bF = new BinaryFormatter();
             FileStream file = File.Open(Application.persistentDataPath + "/data.dat", FileMode.Create);
             CustomClass[][] data = new CustomClass[2][];
             data [0] = new CustomClass[]{new CustomClass(1), new CustomClass(2), new CustomClass(3)};
             data [1] = new CustomClass[]{new CustomClass(4), new CustomClass(5)};
             bF.Serialize(file, data);
             file.Close();
         }
         void Load() {
             BinaryFormatter bF = new BinaryFormatter();
             FileStream file = File.Open(Application.persistentDataPath + "/data.dat", FileMode.Open);
             CustomClass[][] data = (CustomClass[][])bF.Deserialize(file);
             file.Close();
             arr1 = data[0];
             arr2 = data[1];
         }
    

Won’t work…

It looks like this is a bug in Mono’s implementation of the BinaryFormatter (at least in the Mono version that Unity is using).