как сериализовать базовый класс? - PullRequest
0 голосов
/ 13 марта 2020

У меня есть два класса в c#. Sub и Base. Они оба имеют свойство [Serializable]. Я только сериализую экземпляр подкласса и хочу, чтобы он оставил поле базового класса, но это не так. Я действительно не знаю, как работает сериализация, я использую сериализацию basi c. NET и сохраняю ее как строку JSON. Иногда это работает, а иногда нет, я действительно не знаю почему. Как я могу пообещать, что базовый класс будет сериализован?

Вот подкласс:

[Serializable]

public class Achivment0 : OneGameAchivment
{

    private int n;
    private Player p;
    private float radius;
    private PositionTracker track;

    public Achivment0()
    {

    }
...

Вот первый базовый класс:

[Serializable]

public abstract class OneGameAchivment : AbstractAchivments
{

}

И вот последний базовый класс:

[Serializable]
public class AbstractAchivments
{
    public static int MAX_RANK = 5;

    // Serialized filed
    public int rank; // 0 - MAX_RANK
    public string name;
    public bool initialized;
    public bool help;

    public AbstractAchivments()
    {

    }
...

У меня есть объект, который содержит подкласс, вот он:

public class AchivmentData
{
    private static AchivmentData singelton = null;
    private static string save_string = "achivments_save_file";

    public int current_version;
    public List<AbstractAchivments> list;

    private AchivmentData()
    {
    }

    private void SetData()
    {
        Debug.Log("Created Achivment Data");
        list = new List<AbstractAchivments>();
        current_version = AppInfo.version;
        list.Add(new Achivment0());
        list.Add(new Achivment1());
        list.Add(new Achivment2());
        list.Add(new Achivment3());
        list.Add(new Achivment4());
        list.Add(new Achivment5());
        list.Add(new Achivment6());
    }

    public List<AbstractAchivments> GetList()
    {
        return list;
    }

    public static AchivmentData Create()
    {
        if (singelton == null)
        {
            singelton = Restore();
            if (singelton == null || (AppInfo.version > singelton.current_version))
            {
                singelton = new AchivmentData();
                singelton.SetData();
                singelton.Save();
            }
        }
        return singelton;
    }

    public static AchivmentData Restore()
    {
        string p = PlayerPrefs.GetString(save_string);
        if (p != null && p.Length > 0)
        {
            AchivmentData s = JsonUtility.FromJson<AchivmentData>(p);
            if (s != null)
            {
                return s;
            }
        }
        return null;
    }

    public void Save()
    {
        string json = JsonUtility.ToJson(this);
        PlayerPrefs.SetString(save_string, json);
    }
}

1 Ответ

0 голосов
/ 14 марта 2020

Оказывается, он сериализовал объект так, как я хотел. В своем коде я проверил, является ли абстрактный класс подклассом, используя оператор 'as'

OneGameAchivment a = ach as OneGameAchivment;

Но оказалось, что оператор 'as' проверяет только тип объекта stati c, так это не сработало. Я заменил его на пробный бросок, и теперь он отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...