【问题标题】:(Unity) Why is my list of a class not getting saved in JSON(Unity)为什么我的类列表没有保存在 JSON 中
【发布时间】:2018-06-15 18:23:36
【问题描述】:

我想保存一个对话项目列表。我制作了一个名为对话项目的脚本,它只是一条消息,我制作了一个数组,这样它就可以成为一个对话,我制作了一个对话列表,这样我就可以进行多个对话。

[SerializeField] public List<DialogueList> dialogue = new List<DialogueList();

所以我创建了一个名为 DialogueList 的类的变量,其中包含对话项。

[System.Serializable]
public class DialogueList
{
    [SerializeField] public string convoName;
    [SerializeField] public int dialogueID;
    [SerializeField] public DialogueItem[] dialogues;
}

我想保存这些对话,以便在稍后阶段以特定语言加载它们。但是由于某种原因,当我尝试保存名为 dialog 的变量时,我的 JSON 文件为空。

    string jsonData = JsonUtility.ToJson(dialogue, true);
    string _fullPath = "/caroline-dialogue" + ".json";
    File.WriteAllText(Application.persistentDataPath + _fullPath, jsonData);

我尝试使用另一种方法,它确实有效,但它会变得非常混乱。

    for (int i = 0; i < dialogue.Count; i++)
    {
        string jsonData = JsonUtility.ToJson(dialogue[i], true);
        string _fullPath = "/caroline-dialogue-" + i + ".json";
        File.WriteAllText(Application.persistentDataPath + _fullPath, jsonData);

    }

我的问题是:我做错了什么?我是不是忘记了什么?我猜是名为 dialog 的变量有问题,因为使用 for 循环保存所有对话项都有效。

我希望我能很好地解释我的问题。

【问题讨论】:

    标签: arrays json list unity3d


    【解决方案1】:

    不支持使用JsonUtility 对数组或列表进行序列化/反序列化。您需要将列表包装在可序列化的类中:

    [Serializable]
    private class DialogueListWrapper
    {
        public List<DialogueList> objects;
    }
    

    【讨论】:

    • 另外,确保DialogueItem 也是可序列化的。
    • 好点,但据我所知,如果数组是一个字段,它们确实可以工作,并且不会自己传递给JsonUtility
    • 我自己没有搞砸过,但我相信你是对的。我的评论更像是“如果数组的类型本身没有序列化,它仍然不起作用!”内置类型当然可以,但自定义类型仍然需要 [SerializedField]s 等等。
    • 哦,对不起,误会了。是的,这也是必需的。您可以发布另一个答案来指定这一点,但似乎 OP 已经解决了这个问题。
    • 是的,我已经序列化了几乎所有内容,但 Krypt1 提供的解决方案有效。
    猜你喜欢
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    相关资源
    最近更新 更多