Serialization Surrogate is setting of binary serializer and deserializer.
Unity provides many useful data model but not natively serializable to binary. Following types are included in this library.
[System.Serializable]
public class PlayerData
{
public string playerName;
public int score;
public Vector3 position;
public PlayerData(string name, int score, Vector3 pos)
{
playerName = name;
this.score = score;
position = pos;
}
}
public class SerializationExample : MonoBehaviour
{
private string filePath;
void Start()
{
filePath = Application.persistentDataPath + "/playerData.dat";
PlayerData data = new PlayerData("John", 100, new Vector3(1, 2, 3));
SerializeData(data);
PlayerData loadedData = DeserializeData();
if (loadedData != null)
{
Debug.Log("Loaded Player Name: " + loadedData.playerName);
Debug.Log("Loaded Score: " + loadedData.score);
Debug.Log("Loaded Position: " + loadedData.position);
}
}
void SerializeData(PlayerData data)
{
IFormatter formatter = GetBinaryFormatter();
using (FileStream stream = new FileStream(filePath, FileMode.Create))
{
formatter.Serialize(stream, data);
}
Debug.Log("Data serialized to " + filePath);
}
PlayerData DeserializeData()
{
if (File.Exists(filePath))
{
IFormatter formatter = GetBinaryFormatter();
using (FileStream stream = new FileStream(filePath, FileMode.Open))
{
return formatter.Deserialize(stream) as PlayerData;
}
}
else
{
Debug.LogWarning("Save file not found in " + filePath);
return null;
}
}
private IFormatter GetBinaryFormatter()
{
BinaryFormatter formatter = new();
SurrogateSelector selector = new();
Vector3SerializationSurrogate vector3Surrogate = new();
selector.AddSurrogate(
typeof(Vector3),
new StreamingContext(StreamingContextStates.All),
vector3Surrogate
);
formatter.SurrogateSelector = selector;
return formatter;
}
}
Library provides a Helper function to Get Binary Formatter with all supported surrogate in this page.