2015-12-14 7 views
5

Próbowałem użyć nowej funkcji serializacji JSON w Unity 5.3, a ja napisałem poniższy kod, odwołując się do przykładu użycia podanego na stronie Unity. Jedyną inną częścią, którą stworzyłem, było stworzenie zmiennych klasy obiektu (klasa FruitItem w moim przypadku) za pomocą settera i gettera zamiast tworzenia czystych publicznych zmiennych. Robiąc to, mam tylko parę aparatów bez zawartości w środku. Jeśli jednak usuwam metodę pobierającą i ustawiającą, a zmienne klasy będą czystymi publicznymi zmiennymi, będę mógł uzyskać poprawny wynik. Czy ktokolwiek może mi podpowiedzieć, dlaczego tak się stało? Z góry dziękuje za twoją pomoc.Dlaczego otrzymałem pusty ciąg JSON zwrócony podczas używania settera i gettera w klasie obiektu w Unity 5.3?

kod, który działa prawidłowo:

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; 

} 

Kod, który nie działa prawidłowo:

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

} 

Odpowiedz

15

Jedność nie może serializacji właściwości.

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

System serializacji stosować można wykonać następujące czynności:

  • CAN serializacji publicznych nonstatic pól (z serializować typów)
  • niepublicznych pola nonstatic CAN serializacji oznaczone [SerializeField] atrybutu.
  • Nie można serializować pól statycznych.
  • NIE można szeregować właściwości.

danej dziedzinie będzie serializacji tylko wtedy, gdy jest typu, że jedność może szeregować:

SERIALIZABLE typy to:

  • wszystkich klasach dziedziczących z UnityEngine.Object np GameObject, Component, MonoBehaviour, Texture2D, AnimationClip.
  • Wszystkie podstawowe typy danych, takie jak int, string, float, bool.
  • Niektóre wbudowane typy, takie jak Vector2, Vector3, Vector4, kwaternion, Matrix4x4, Color, Rect, LayerMask.
  • Tablice typu serializable
  • Lista postaci szeregowej typu
  • wyliczenia
  • elemencie
+0

Dzięki za odpowiedź i odniesienie podałeś, Mattias. Nie zdawałem sobie sprawy, że istnieją ograniczenia dotyczące typów obsługiwanych przez serializację jedności. Jednak do słowa kluczowego "[Serializable]" odwołano się "używając System". Wygląda na to, że coś jest .Net. Zastanawiam się, czy ograniczenia serializacji ustalone dla Unity będą miały tak duży wpływ. Dzięki jeszcze raz. –

+0

Dzięki za odpowiedź – tim

+0

Nie jestem pewien, czy to nadal jest dokładne. Zgodnie z najnowszą dokumentacją: https://docs.unity3d.com/ScriptReference/JsonUtility.FromJson.html "Obsługiwane są tylko proste klasy i struktury, klasy pochodzące z UnityEngine.Object (takie jak MonoBehaviour lub ScriptableObject) nie są. " Wygląda na to, że pierwszy punkt na liście typów Serializable jest teraz niepoprawny. –

Powiązane problemy