web-dev-qa-db-ja.com

Unity C#JsonUtilityはリストをシリアル化していません

シリアル化/逆シリアル化する必要のあるデータがありますが、JsonUtilityが本来の動作をしていません。私が使用しているオブジェクトは次のとおりです。

public class SpriteData {
    public string Sprite_name;
    public Vector2 Sprite_size;
    public List<Vector2> subimage;
}

public class SpriteDataCollection
{
    public SpriteData[] sprites;
}

SpriteDataCollectionを作成し、JsonUtilityでシリアル化しようとすると、空のオブジェクト{}が取得されます。構築方法は次のとおりです。

            SpriteData data = new SpriteData();
            data.Sprite_name = "idle";
            data.Sprite_size = new Vector2(64.0f, 64.0f);
            data.subimage = new List<Vector2> { new Vector2(0.0f, 0.0f) };

            SpriteDataCollection col = new SpriteDataCollection();
            col.sprites = new SpriteData[] { data };

            Debug.Log(JsonUtility.ToJson(col));

デバッグログは「{}」のみを出力します。なぜシリアル化されないのですか?私はそれをテストしました、そして、単一のSpriteDataを直列化することはそれがすることになっていることを正確にしますが、それはSpriteDataCollectionで動作しません。

11

Unityで空のJsonを取得する可能性がある4つの既知の考えられる理由があります。

1[Serializable]を含まない。これを含めないと、空のjsonを取得します。

2。変数としてプロパティ(get/set)を使用します。 JsonUtilityはこれをサポートしていません。

3List以外のコレクションのシリアル化を試みます。

4。あなたのjsonはJsonUtilityがサポートしておらず、 wrapper を必要とするマルチ配列です。動作するように。

問題は#1のように見えます。クラスに[Serializable]がありません。それを使用するには、using System;を追加する必要があります。

[Serializable]
public class SpriteData {
    public string Sprite_name;
    public Vector2 Sprite_size;
    public List<Vector2> subimage;
}

そして

[Serializable]
public class SpriteDataCollection
{
    public SpriteData[] sprites;
}

5。上記のSpriteDataクラスの例と同様に、変数はパブリック変数でなければなりません。プライベート変数の場合は、[SerializeField]を先頭に追加します。

[Serializable]
public class SpriteDataCollection
{
    [SerializeField]
    private SpriteData[] sprites;
}

それでも動作しない場合、jsonはおそらく無効です。 "4.JsonUtilityのトラブルシューティング""UnityでJsonおよびJsonアレイをシリアル化およびデシリアライズする" 投稿の回答から。これにより、これを修正する方法について説明します。

20
Programmer