none
關於get;set;與json讀寫之間的問題 RRS feed

  • 問題

  • 各位大大好

    小弟在做json的讀寫中

    發現以下的狀況

    public class Data

    {

            public string name{get;set;}

            public string level{get;set;}

    }

    這樣的設定會令json的讀寫出現問題

    資料實際上並沒有被寫入檔案中

    如果改成

    public class Data

    {

            public string name;

            public string level;

    }

    這樣就沒有問題了

    請問這是什麼原因呢?

    以下是我的程式碼

    public void Save()
        {
            Data data = new Data();
            data.name = Name.text;
            data.level = Level.GetComponentInChildren<Text>().text;

            string saveString = JsonUtility.ToJson(data);

            StreamWriter file = new StreamWriter("D:/Zen/TrueSenseSkill/conf/zen");
            file.Write(saveString);
            file.Close();

            Debug.Log(data.name);
            Debug.Log(data.level);
        }

        public void Load()
        {
            StreamReader file = new StreamReader("D:/Zen/TrueSenseSkill/conf/zen");
            string loadJson = file.ReadToEnd();
            file.Close();

            Data data = new Data();

            data = JsonUtility.FromJson<Data>(loadJson);

            title.text = data.name + "\n" + data.level;
        }


    感謝各位的閱讀

    2021年1月11日 上午 02:09

解答

  • 你是用 Unity3D 的  JsonUtility.ToJson 嗎 ? 根據文件的說明,這個方法 (以及 FromJson) 是只對 類別(或結構) 欄位(field)作用, 而不是對屬性 (property) 作用。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 NoMoreTalk 2021年1月12日 上午 05:55
    2021年1月11日 下午 01:45
    版主
  • 序列化(例如 ToJson)只能串联数据,不能串联函数。get、set 这个是函数,c# 编译器会自动根据属性名创建成员变量(member variable),但所使用的名称不定,是自动命名的,所以就会失败。以前在 c、c++ 中都是变量(variable)和函数(function)这两个概念,后来受 java 影响,从 .net 开始也引入属性(property)、事件(event)这类概念。这个确实有助于代码的理解,但缺点就是这种抽象概念使得很多人更加难以理解代码的工作原理。property 这种东西其实是 function,并非是 variable。function 意味着可以在其中包含逻辑处理运算,而这样的运算显然是不能 to json 的,只有数据可以 to json。无论概念怎么变,数据永远只有一种,就是 variable。variable 在 .net 中被称作 field。

    public string name{get;set;} 这样的东西最终会被编译器改成:

    private string m_name; //m_name只是我随便起的名称,编译器可以用任何名称来自动命名。
    public string name
    {
        string get()
        {
            return m_name;
        }
        void set(string value)
        {
            m_name = value;
        }
    }
    • 已標示為解答 NoMoreTalk 2021年1月12日 上午 05:55
    2021年1月11日 下午 06:54

所有回覆

  • 你是用 Unity3D 的  JsonUtility.ToJson 嗎 ? 根據文件的說明,這個方法 (以及 FromJson) 是只對 類別(或結構) 欄位(field)作用, 而不是對屬性 (property) 作用。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 NoMoreTalk 2021年1月12日 上午 05:55
    2021年1月11日 下午 01:45
    版主
  • 序列化(例如 ToJson)只能串联数据,不能串联函数。get、set 这个是函数,c# 编译器会自动根据属性名创建成员变量(member variable),但所使用的名称不定,是自动命名的,所以就会失败。以前在 c、c++ 中都是变量(variable)和函数(function)这两个概念,后来受 java 影响,从 .net 开始也引入属性(property)、事件(event)这类概念。这个确实有助于代码的理解,但缺点就是这种抽象概念使得很多人更加难以理解代码的工作原理。property 这种东西其实是 function,并非是 variable。function 意味着可以在其中包含逻辑处理运算,而这样的运算显然是不能 to json 的,只有数据可以 to json。无论概念怎么变,数据永远只有一种,就是 variable。variable 在 .net 中被称作 field。

    public string name{get;set;} 这样的东西最终会被编译器改成:

    private string m_name; //m_name只是我随便起的名称,编译器可以用任何名称来自动命名。
    public string name
    {
        string get()
        {
            return m_name;
        }
        void set(string value)
        {
            m_name = value;
        }
    }
    • 已標示為解答 NoMoreTalk 2021年1月12日 上午 05:55
    2021年1月11日 下午 06:54