Unity3d 为什么这些类会序列化为json的;{};

Unity3d 为什么这些类会序列化为json的;{};,unity3d,Unity3d,很明显,我今天过得很糟糕,我尝试过结构和类,为什么当我使用unitys JsonUtility.ToJson时,我只得到{}当我知道类实际上填充了81个数组项时 [Serializable] public struct PuzzleData { public CellData[,] values; } [Serializable] public struct CellData { public int value; public bool isFixed; } 所以我

很明显,我今天过得很糟糕,我尝试过结构和类,为什么当我使用unitys JsonUtility.ToJson时,我只得到{}当我知道类实际上填充了81个数组项时

[Serializable]
public struct PuzzleData
{
    public CellData[,] values;
}

[Serializable]
public struct CellData
{
    public int value;
    public bool isFixed;
}
所以我用:

var tmp = new PuzzleData();
tmp.values = new CellData[9, 9];
tmp.values[0,0]=1;
<more lines>
string json = JsonUtility.ToJson(tmp);
Debug.Log(json);
var tmp=新数据();
tmp.values=新单元数据[9,9];
tmp.值[0,0]=1;
字符串json=JsonUtility.ToJson(tmp);
Log(json);
但是我的json仍然是“{}”,但是我知道这个类有数据,因为我也会将它发送到游戏中进行填充,所有的数据都会在我输入时显示出来。JsonUtility类表示它将处理可序列化类型的数组,这是。。。所以


我知道它是数组,但我使用数组,但不可否认,我以前只把它们作为传入数据,但是,就我的一生而言,我不明白为什么它不做这项工作。(顺便说一句,当类的构造函数负责生成单元格数据值时)因此该类在unity中无论哪种方式都可以很好地工作,但只是没有让json位工作

正如@Trojanfoe在评论中已经提到的,这是由于2D数组,而
JsonUtility.ToJson
所依赖的序列化程序不支持2D数组

而且,即使它相当模糊,它实际上是有文件记录的。如果你愿意进入兔子洞一点:

从(我的)重点:

在内部,此方法使用Unity序列化程序因此,序列化程序必须支持传入的对象:它必须是应用了Serializable属性的MonoBehavior、ScriptableObject或普通类/结构。序列化程序必须支持要包含的字段类型;不支持的字段将被忽略,私有字段、静态字段和应用了非序列化属性的字段也将被忽略

现在这里没有提到任何关于多维数组的内容。。。但是,如果我们转到并向下滚动到一个小音符,我们会发现以下内容(我的重点):

注意:Unity不支持多级类型的序列化(多维数组、锯齿数组和嵌套容器类型)。如果要序列化这些,有两个选项:将嵌套类型包装在类或结构中,或使用序列化回调ISerializationCallbackReceiver执行自定义序列化。有关详细信息,请参阅有关自定义序列化的文档

Unity Technologies的SuperPig在2016年2月24日的一份报告中证实了这一点,他后来在报告中也提到了这一点

它们将与支持其他类型的编辑器同时出现——不过,这在未来并不一定“遥远”,因为我需要为人们想要的各种其他功能(如字典支持)开发序列化程序


遗憾的是,到目前为止还没有出现这种情况。

我认为c#json功能在getter和setter上不起作用。我认为您无法序列化多维数组。将其设置为一维,并在代码中抽象多维位(您知道,使用类似于:
index=row*num_columns+column
)的东西)。@特洛伊木马程序必须使用,这会非常烦人。。这似乎很奇怪,它没有提到它不支持多个阵列,它说它支持阵列……有一个我是对的:)@Cid不,相反!在
支持的类型部分中:
Unity仅序列化字段