Error serializing a class to save / load

Hello everyone:

I have this problem: I try to save the current status of a game I’m developing, and this “progress” is written in a Texture2D. Think of it like a MS Paint canvas where you draw things, only it’s not :slight_smile: Even after doing as I was told looking in other answers around here, the final save file is around 1kb, when it should be around 3MB (the texture is quite large).

Anyway, I follow this thread’s path, or this different simpler path, and it’s still not working for me… There’s something wrong with the serializing part, that’s for sure.

Here’s my code:

[System.Serializable]
public class SaveData {
    
   public Texture2D normalMap;
    
}

public class SaveLoad {
	
	public static string currentFileName = "SaveGame.hur";				// Edit this for different save files
	public static string currentFilePath = Application.persistentDataPath + "/Saves/";

  	// Call this to write data
  	public static void Save (Texture2D norm)  		// Overloaded
  	{
    	    Save (currentFilePath + currentFileName, norm);
  	}

  	public static void Save (string filePath, Texture2D norm)
  	{ 
	    SaveData data = new SaveData ();
	    data.normalMap = new Texture2D(norm.width, norm.height);
	    data.normalMap.SetPixels(norm.GetPixels());
	    data.normalMap.Apply();
	    FileStream stream = new FileStream(filePath, FileMode.Create);
	    try {
	        BinaryFormatter bformatter = new BinaryFormatter();
	        bformatter.Serialize(stream, data);
	    }
	    catch (SerializationException e) {
	        Debug.LogError("Excepcion al serializar el savegame. Datos: " + e.Message);
	    }
	    finally {
	        stream.Close();
	    }
  	}

  	// Call this to load from a file into "data"
  	public static SaveData Load ()  {				// Overloaded
	    return Load(currentFilePath + currentFileName);
	}   
    

  	public static SaveData Load(string filePath) 
  	{
	    SaveData data = new SaveData ();
	    FileStream stream = new FileStream(filePath, FileMode.Open);
	    try {
	        BinaryFormatter bformatter = new BinaryFormatter();
	        data = (SaveData)bformatter.Deserialize(stream);
	    }
	    catch (SerializationException e) {
	        Debug.LogError("Excepcion al deserializar el savegame. Datos: " + e.Message);
	    }
	    finally {
	        stream.Close();
	    }
        return data;
	}

That’s only a sample, it’s actually bigger but that’s the part that’s failing, I’m quite sure of that. For more information, right now I’m getting this error:

Excepcion al serializar el savegame. Datos: Type UnityEngine.Texture2D is not marked as Serializable.

This is captured in this “try”:

try {
    BinaryFormatter bformatter = new BinaryFormatter();
    bformatter.Serialize(stream, data);
}

…while saving in the method Save.

I’ve read (here) that Texture2D is a Serializable type of object, so this is weird to me…
I’m using unity 3.4, windows 7 x64 and this is written in c#, but the script that makes the call to “Save” and “Load” functions is in JS.

Any insight in this please? Any help would be GREATLY appreciated!

Thanks!

2 Answers

2

Finally I solved the problem… It turns out you can’t serialize Texture2D (even if it’s supposed to work), or at least you can’t do it that way.
I surrendered and did it with a float array with the color values of the pixels and it all worked out with the same code.

So you know it now, don’t serialize Texture2D :smiley:

Can you please explain how you actually did it? I am not able to get it.

Maybe you can try again with

Texture2D.EncodeToPNG

which return byte and serialize that.

Texture2D textFb2 = new Texture2D(url.texture.width, url.texture.height, TextureFormat.ARGB32, false); byte[] bytes = textFb2.EncodeToJPG(); string s = Convert.ToBase64String(bytes); I am using this to encode an image to base64 but the when i check the resultant string by covering it to an image i get a grey image of dimension 50x50. My motive is to get user's profile image from Facebook and store it to backend in base64 format