2015-12-14 27 views
5

Unity 5.3で新しいJSONシリアライズ機能を使用しようとしましたが、Unity Webサイトで提供されている使用例を参照して次のコードを書きました。私が作った唯一の違いは、純粋なパブリック変数にする代わりに、setterとgetterを使ってオブジェクトクラス(私の場合はFruitItemクラス)の変数を作成することでした。これを行うことで、中身のない中括弧しか得られませんでした。しかし、getterとsetterを削除してクラス変数を純粋なpublic変数にすると、私は正しい結果を得ることができます。何が起こったのか誰にでも私に何かヒントを与えることができますか?あなたの助けを前にありがとう。正常に動作Unity 5.3のオブジェクトクラスでsetterとgetterを使用しているときに空のJSON文字列が返されたのはなぜですか?

コード:

using UnityEngine; 
using UnityEditor; 
using System.Collections; 
using System; 

public class testJson : MonoBehaviour { 


    // Use this for initialization 
    void Start() { 

     FruitItem myFruit = new FruitItem(){ name = "apple", price = 52, quantity = 53 }; 

     string jsonString = JsonUtility.ToJson (myFruit); 
     Debug.Log (jsonString); 

    } 



    // Update is called once per frame 
    void Update() { 

    } 
} 

[Serializable] 
public class FruitItem{ 

    //using the pure public variables and the output will be: 
    //{"name":"apple","quantity":53,"price":52} 

    public string name; 
    public int quantity; 
    public int price; 

} 

コード正しく動作しません:

using UnityEngine; 
using UnityEditor; 
using System.Collections; 
using System; 

public class testJson : MonoBehaviour { 


    // Use this for initialization 
    void Start() { 

     FruitItem myFruit = new FruitItem(){ name = "apple", price = 52, quantity = 53 }; 

     string jsonString = JsonUtility.ToJson (myFruit); 
     Debug.Log (jsonString); 

    } 



    // Update is called once per frame 
    void Update() { 

    } 
} 

[Serializable] 
public class FruitItem{ 

    //using the pure public variables and the output will be: 
    //{} 

    public string name{ get; set;} 
    public int quantity{ get; set;} 
    public int price{ get; set;} 

} 

答えて

15

Unityはプロパティをシリアル化することはできません。次の操作を行うことができます使用

http://docs.unity3d.com/ScriptReference/SerializeField.html

シリアライゼーション・システム:

  • は非公開非静的フィールドをシリアライズCAN
  • (シリアライズ可能型の)公共の非静的フィールドをシリアライズCANは、[SerializeField]属性でマーク。
  • 静的フィールドをシリアル化できません。
  • プロパティをシリアル化できません。

    シリアライズ種類は次のとおりです:

    • UnityEngine.Objectから継承するすべてのクラス、例えばゲームオブジェクト、コンポーネント、それはUnityがシリアライズ可能型である場合

    あなたのフィールドはシリアライズされますMonoBehaviour、Texture2D、AnimationClip。

  • int、string、float、boolなどのすべての基本データ型。
  • Vector2、Vector3、Vector4、Quaternion、Matrix4x4、Color、Rect、LayerMaskなどの組み込みタイプもあります。シリアライズ可能なタイプの
  • 配列あなたの応答とあなたが提供された基準、マティアスため
  • シリアライズ可能なタイプの一覧
  • 列挙
  • 構造体
+0

感謝。私は、統一されたシリアライゼーションによってサポートされる型の制限があることを認識しませんでした。ただし、キーワード「[Serializable]」は「using System」によって参照されました。それはネットのようなものです。 Unityに設定されているシリアライゼーションの制限がそれに影響を与えるかどうかは疑問です。再度、感謝します。 –

+0

あなたの答えをありがとう – tim

+0

私はまだこれが正確であるか分からない。最新のドキュメントによると:https://docs.unity3d.com/ScriptReference/JsonUtility.FromJson.html "単純なクラスと構造だけがサポートされています; UnityEngine.Objectから派生したクラス(MonoBehaviourやScriptableObjectなど)はサポートされていません。 " シリアライズ可能なタイプのリストの最初の箇条書きが間違っているようです。 –

関連する問題