2017-01-22 6 views
1

シリアライズ/デシリアライズする必要があるデータがありますが、JsonUtilityは想定していることをしていません。私はSpriteDataCollectionを作成し、JsonUtilityでそれをシリアル化しようとすると、私はちょうど空のオブジェクト{}を取得Unity C#JsonUtilityがリストをシリアライズしていません

public class SpriteData { 
    public string sprite_name; 
    public Vector2 sprite_size; 
    public List<Vector2> subimage; 
} 

public class SpriteDataCollection 
{ 
    public SpriteData[] sprites; 
} 

:ここでは私が働いているオブジェクトです。それはどのようにビルドされているのですか:

  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)); 

デバッグログは「{}」だけを表示します。なぜそれは何かをシリアル化していないのですか?私はそれをテストして、1つのSpriteDataをシリアル化することは、それが行うべきものを正確に行いますが、SpriteDataCollectionでは機能しません。

答えて

9

Unityで空のJsonを取得する可能性がある理由は4つあります。

[Serializable]を含まない。あなたがこれを含まなければ空のjsonを得る。

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

List以外のコレクションをシリアル化しようとしています。

。あなたのjsonはマルチアレイです。JsonUtilityは、wrapperをサポートしていません。

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

[Serializable] 
public class SpriteData { 
    public string sprite_name; 
    public Vector2 sprite_size; 
    public List<Vector2> subimage; 
} 

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

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

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

まだあなたのJSONはおそらく無効で、その後動作しない場合。 「4.トラブルシューティングJsonUtility」"Serialize and Deserialize Json and Json Array in Unity"の回答の回答を読んでください。それはあなたにこれを修正する方法をあなたに与えるはずです。

+1

私はそれが何らかの種類の魔法のタグか何かをしていると思った。ありがとう。今のところ意図どおりに動作しています。 –

+0

私はこれに遭遇しましたが、問題は5でした。私のフィールドは公開されていませんでした。私はそれがルールにあることを知っている、ちょうど私の心を滑った。 –

+0

@KylePostlewaitプライベートであれば、シリアル化されません。ただし、プライベートフィールドの上に '[SerializeField]'を置いてシリアル化することもできます。 – Programmer

関連する問題