Kentavr16
@Kentavr16
long cold winter

Как пофиксить ошибку сериализации в XML?

В юнити создаю свой менеджер сценариев.
spoiler
[System.Serializable]
public class ScenarioManeger
{
    [NonSerialized] public GameDataManager GDM;
    public DialogueManager dialogueManager;
    private Chapter[] chapters;
    public int currentChapter = 0;
    public enum ConditionType
    {
        StartChapter
    }


    private void Awake()
    {
        InitializeFromXML();
    }

    private void Start()
    {
        CheckScenarioActions();
    }

    public void InitializeFromXML()
    {
        ScenarioManeger loadedScenario = Utilities.LoadScenarioManager();
        if (loadedScenario != null)
        {
            this.chapters = loadedScenario.chapters;
            this.currentChapter = loadedScenario.currentChapter;
        }
    }


    public void CheckScenarioActions()
    {
         chapters[currentChapter].isCurrentConditionComplete();
    }

    [System.Serializable]
    public class Condition
    {
        public bool isComplited = false;
        public ConditionType type;
        private ConditionActions actions;

        public bool isCompleteCheck()
        {
            switch (type)
            {
                case ConditionType.StartChapter:
                actions.ExecuteAction(type);
                return true;
                default: return false;
            }
        }

    }
    [System.Serializable]
    public class Chapter
    {
        public List<Condition> conditions;

        public Chapter()
        {
            conditions = new List<Condition>();
        }

        public bool isCurrentConditionComplete()
        {
            if (conditions.Count == 0)
            {
                return true;
            }

            Condition currentCondition = conditions[0];
            bool isCompleted = currentCondition.isCompleteCheck();
            if (isCompleted)
            {
                conditions.RemoveAt(0);
            }
            return isCompleted;
        }
    }
}


Конкретно в этом методе пытаюсь загрузить сценарий из файла:
public void InitializeFromXML()
{
    ScenarioManeger loadedScenario = Utilities.LoadScenarioManager();
    if (loadedScenario != null)
    {
        this.chapters = loadedScenario.chapters;
        this.currentChapter = loadedScenario.currentChapter;
    }
}

Утилита для загрузки -
public static DialogueData LoadDialogueData()
{
    string filePath = Path.Combine(Application.dataPath, "Dialogues", "Dialogues.json");

    if (!File.Exists(filePath))
    {
        Debug.LogError("File not found: " + filePath);
        return null;
    }

    string jsonString = File.ReadAllText(filePath);
    DialogueData loadedData = JsonUtility.FromJson<DialogueData>(jsonString);

    if (loadedData == null)
    {
        Debug.LogError("Failed to load dialogue data.");
        return null;
    }
    return loadedData;
}


Получаю следующую ошибку -
To be XML serializable, types which inherit from IEnumerable must have an implementation of Add(System.Object) at all levels of their inheritance hierarchy


Догадываюсь что ошибка не специфична для юнити, и я упускаю что-то важное и простое. С# изучаю не долго, подозреваю что ошибка банальна. Благодарен за любые подсказки по конкретно моему случаю.

П.С. - смотрел в интернетах, но там зачастую такая ошибка при сериализации более сложных структур.
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Попробуй в классе ScenarioManeger Chapter[] заменить на List<Chapter>.
Скорее всего, при десериализации XML хочет добавить в массив новый элемент, но массив динамически не изменяется, поэтому и возникает ошибка
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы