1

Unity 5.3.2 に含まれる新しい JSONUtility を使用して、基本クラスの子孫であるオブジェクトを含むオブジェクトをシリアル化しようとしています。次に例を示します。

[Serializable]
public class Class1
{
    public int class1Field = 1;
    public Class2 attributes = new Class3();
}
[Serializable]
public class Class3 : Class2
{
    public int class3Field = 3;
}
[Serializable]
public class Class2
{
    public int class2Field = 2;
}

私なら:

Class1 myClass = new Class1();
Debug.Log(JsonUtility.ToJson(myClass));

出力は次のとおりです。

{"class1Field":1,"attributes":{"class2Field":2}}

ご覧のとおり、Class3 からは何もシリアル化されていません。興味深いことに、私がそうするなら:

Debug.Log(JsonUtility.ToJson(myClass.attributes));

出力は次のとおりです。

{"class2Field":2,"class3Field":3}

これは私が期待するものです。string.Format を使用して非常に簡単な回避策を実行できることはわかっていますが、この問題に対するより洗練された解決策はありますか? JSONUtility を正しく使用していないのでしょうか? それとも、これは現時点で JSONUtility によってサポートされていないのでしょうか?

リフレクションを使用してオブジェクトを生成し (この例では「Class3」を置き換えます)、リフレクション オブジェクトが属する最上位オブジェクトをシリアル化するため、この機能を調査しています。

明確にするために、私の望ましい出力は次のとおりです。

{"class1Field":1,"attributes":{"class2Field":2,"class3Field":3}}
4

3 に答える 3

0

最近の回答で申し訳ありません。「attributes」フィールドにキーワード [SerializeField] を入力し忘れました。Unity は Reference Typed フィールドをシリアライズできません。(クラス、カスタム クラス、ゲーム オブジェクト、MonoBehaviour など)。シリアライゼーションの場合、型指定された値 (int、float ..) である必要があります。それでもシリアライズしたい場合は、その [SerializeField] キーワード属性フィールドを追加する必要があり、そのキーワードの使用にも注意してください。

[Serializable] 
public class Class1
{
public int class1Field = 1;
[SerializeField]
public Class2 attributes = new Class3();
}

詳細な説明: Unity SerializeField

于 2016-11-18T23:53:50.553 に答える