InvalidCastException: Specified cast is not valid
Делаю систему сохранений в игре:
using System.Collections.Generic;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using UnityEngine;
public class SaveDataItems : SaveDataRaw
{
public int[] ints = new int[0];
public void PrepareForSave()
{
string data = JsonUtility.ToJson(ints);
}
public void Load()
{
ints = JsonUtility.FromJson<int[]>(data);
}
}
[Serializable]
public class SaveDataRaw
{
public string data;
public void PrepareForSave() { }
public void Load() { }
}
public class SaveManager : MonoBehaviour
{
public static void Save(string fileName, SaveDataRaw data)
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create(Application.persistentDataPath
+ "/"+fileName+".dat");
data.PrepareForSave();
bf.Serialize(file, data);
file.Close();
}
public static SaveDataRaw Load(string fileName)
{
if (File.Exists(Application.persistentDataPath + "/" + fileName + ".dat"))
{
BinaryFormatter bf = new BinaryFormatter();
FileStream file =
File.Open(Application.persistentDataPath + "/" + fileName + ".dat", FileMode.Open);
SaveDataRaw data = (SaveDataRaw)bf.Deserialize(file);
file.Close();
return data;
}
else return new SaveDataRaw();
}
}
Но если я пытаюсь загрузить список предметов
SaveDataItems save = (SaveDataItems)SaveManager.Load("Items");
save.Load();
То при запуске появляется ошибка, подскажите что можно сделать?
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
public static SaveDataRaw Load(string fileName)
Метод возвращает SaveDataRaw, а вы пытаетесь его скастовать в SaveDataItems.
(SaveDataItems)SaveManager.Load("Items");
То есть вы пытаетесь привести тип родителя SaveDataRaw data к наследнику.
Такой каст невозможен. Можно только наследника к родителю, либо наследника, ранее поднятого к родителю опустить обратно к себе.
Вот так можно
SaveDataItems item = new SaveDataItems();
SaveDataRaw cast = (SaveDataRaw)item;
И вот так можно
SaveDataItems item = new SaveDataItems();
SaveDataRaw upcast = (SaveDataRaw)item;
SaveDataItems downcast = (SaveDataItems)upcast;
А вот так нельзя
SaveDataRaw item = new SaveDataRaw();
SaveDataItems cast = (SaveDataItems)item; // InvalidCastException
То есть здесь важен не тип ссылки на объект, и тип самого объекта под ссылкой, который создан с помощью new.