The thing is, I (of course) also want to save the players inventory. The inventory is a collection of items where each item has some attributes like name, value and an icon that is beeing displayed in the inventory. This icon is saved as a Texture2D
So my example SaveDate might look like this:
[Serializable]
public struct SaveGameData
{
public Vector2 PlayerPosition;
public List<Item> Inventory;
}
The XMLSerializer is beeing called like this: XmlSerializer serializer = new XmlSerializer(typeof(SaveGameData), new Type[] { typeof(Item) });
(I use Type[ ] here becauce there are more types to come)
Now the save crashes because Texture2D can not be serialized due to a missing default constructor.
How do I deal with that? Is there a workaround or am I n the wrong way using this kind of saving?
you cannot save a texture2d since it’s stored on the GPU instead of the RAM.
But you wouldn’t want to do that anyways, since that is not “new information” so to say, it’s not something that has to be saved (rather you just want to save the reference)
What I would rather do is
have a class that stores all texture2ds of the icons.
So for example
public class IconManager
{
public Texture2D IconStar;
etc.
}
and load the textures from there.
Then in IconManager you also make an enumerable like this
public Enum IconType { Star, Stripe, etc. }
In your inventory item class you only store this icontype for the specific inventory item.
So for example
public IconManager.IconType Icon
Then, you need a function inside your Iconmanager that returns a texture2d based on the input of IconType
So you basically just make a switch function and return the correct icon texture.
When you draw your icon you can use this function to draw the correct icon for each inventory item.
I hope I helped, but it’s just one of hundreds of possible solutions.
Yeah, already thought that I need to do some kind of mapping instead. Should not be a big deal, since those icons already have an unique key corresponding to the actual image-file.
Actually you can pretty easily save Texture2D by using the GetData and SetData methods and just saving/loading the color array, tho I would recommend you only use it in case you made modifications to the texture during runtime, otherwise you are just wasting performance.
Why don’t you just save the id of the item to your save file. Should be better if you have a list of items which you are loading before.
Saving textures is possible too, but not cool in your case.
I’m saving textures in my map files, i like it more to have 1 map file instead of the map file+lots of textures.
To just not save the texture just tell the xmlserialize to ignore it.
XmlIgnore Instructs the Serialize method of the XmlSerializer not to serialize the public field or public read/write property value
NonSerialized Indicates that a field of a serializable class should not be serialized.
As for textures in the case crazy states that might be a bit tougher. In the opposite case what stealth said sounds reasonable and you could serialize that id.
Alternatively if required say you had a paint program or so, i suppose you could save it to disk separately and load it from stream. Im not sure if this still works or if it works on every platform.
were t is the texture.
FileStream fs = new FileStream(fullFilePath, FileMode.Create);
t.SaveAsPng(fs, t.Width, t.Height);
Thank you for your answers.
I solved - like most of you suggested - with not storing the texture but its ID (which good enough).
The Texture2D property in the item class is marked with [XmlIgnore].