统一C#JSON赢得';是否序列化私有2D数组?

统一C#JSON赢得';是否序列化私有2D数组?,c#,json,unity3d,serialization,private,C#,Json,Unity3d,Serialization,Private,我创建了一个自定义类,需要将其序列化为json文件以保存。 我得到了它,这样它就可以写入文件,但除非我将数组标记为public,否则它不会序列化数据,只会保存一个(大部分)空白文件 using System; using System.IO; using UnityEngine; [Serializable] public class SettingsData { [SerializeField] int[,] schedule = new int[7,24]; //stores

我创建了一个自定义类,需要将其序列化为json文件以保存。 我得到了它,这样它就可以写入文件,但除非我将数组标记为public,否则它不会序列化数据,只会保存一个(大部分)空白文件

using System;
using System.IO;
using UnityEngine;

[Serializable]
public class SettingsData
{
    [SerializeField] int[,] schedule = new int[7,24];    //stores the each hour in a 2D array [day,hour]

    public void Save()
    {
        string jsn = JsonUtility.ToJson(this);
        string path = Application.persistentDataPath + "/settings.json";

        Debug.Log(path);
        File.WriteAllText(path, jsn);
    }
}
它吐出的是:

{}
我想让它吐出来的是:

{"schedule":[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]}
我尝试过其他JSON序列化程序(neuecc/Utf8Json和Newtonsoft.JSON),但这些都不起作用

我试着把它做成一维数组而不是二维数组,但没有成功

我甚至把函数移到了类之外,以防它是“(this)”把它搞砸了,它不是

公开确实有效,但我希望这是私人的


如何在不公开的情况下使其序列化?

1D私有数组可以序列化

[可序列化]
公共类JsonDataTest
{
[序列化字段]
私有整数[,]计划=新整数[7,24];
[序列化字段]
私人INTA=3;
[序列化字段]
私有列表b=新列表();
[序列化字段]
私有整数[]c=新整数[9];
公共作废保存()
{
字符串jsn=JsonUtility.ToJson(this);
Log($“json字符串:{jsn}”);
}
}
日志:

您可以使用MonoBehavior,如下所示:

公共类序列化测试:MonoBehavior
{
[序列化字段]
私有整数[,]计划=新整数[7,24];
[序列化字段]
私人INTA=3;
[序列化字段]
私有列表b=新列表();
[序列化字段]
私有整数[]c=新整数[9];
}

检查哪一个可以序列化。

1D专用数组可以序列化

[可序列化]
公共类JsonDataTest
{
[序列化字段]
私有整数[,]计划=新整数[7,24];
[序列化字段]
私人INTA=3;
[序列化字段]
私有列表b=新列表();
[序列化字段]
私有整数[]c=新整数[9];
公共作废保存()
{
字符串jsn=JsonUtility.ToJson(this);
Log($“json字符串:{jsn}”);
}
}
日志:

您可以使用MonoBehavior,如下所示:

公共类序列化测试:MonoBehavior
{
[序列化字段]
私有整数[,]计划=新整数[7,24];
[序列化字段]
私人INTA=3;
[序列化字段]
私有列表b=新列表();
[序列化字段]
私有整数[]c=新整数[9];
}
检查哪一个可以序列化。

从:

这基本上意味着您不能序列化任何无法在monobehavior中序列化的内容

Netonsoft的Json.net支持这一点,您需要做两件事:

  • 将类标记为
    [JsonObject]
  • [JsonProperty]
  • 从:

    这基本上意味着您不能序列化任何无法在monobehavior中序列化的内容

    Netonsoft的Json.net支持这一点,您需要做两件事:

  • 将类标记为
    [JsonObject]
  • [JsonProperty]

  • 我不习惯使用unity json UTIL,但通常在这种情况下,我会创建一个单独的json文件模型类,其中包含用于序列化的公共属性。我不习惯使用unity json UTIL,但通常在这种情况下,我会创建一个单独的json文件模型类,其中包含用于序列化的公共属性
    json string:{"a":3,"b":[],"c":[0,0,0,0,0,0,0,0]}
    
    Internally, this method uses the Unity serializer; therefore the object you pass in must be supported by the serializer: it must be a MonoBehaviour, ScriptableObject, or plain class/struct with the Serializable attribute applied. The types of fields that you want to be included must be supported by the serializer; unsupported fields will be ignored, as will private fields, static fields, and fields with the NonSerialized attribute applied.