2015-11-28 3 views
0

Я просто хочу сериализовать некоторые данные и десериализовать их обратно, и он должен работать на платформе iOS. JOS.NET не работает на iOS. JsonFX может сериализовать данные, а строка выглядит как строка, сериализованная Json.Net, но JsonFX не может десериализовать данные. Простой код, который дает мне следующую ошибку:Unity, JsonFX не deserialize

InvalidCastException: Нельзя отбрасывать из источника в тип адресата.

using UnityEngine; 
using UnityEngine.UI; 
using System.Collections.Generic; 
using Pathfinding.Serialization.JsonFx; 

public class jsonTest : MonoBehaviour { 

    public Text text; 
    public List<ChapterModel> chapters; 

    // Use this for initialization 
    void Start() { 
     chapters = new List<ChapterModel>(); 

     for(int i=0; i<2; i++) 
     { 
      var cm = new ChapterModel(); 
      cm.pages = new List<PageModel>(); 
      cm.id = i; 

      for(int j =0; j<2; j++) 
      { 
       var pm = new PageModel(); 
       pm.BackgroundArt = j.ToString(); 
       cm.pages.Add(pm); 
      } 

      chapters.Add(cm); 
     } 

     Debug.Log(JsonReader.Deserialize<List<ChapterModel>>(JsonWriter.Serialize(chapters)).Count); 
    } 
} 

Кто-нибудь знает, как это исправить?

ответ

0

После игры вокруг немного с JsonFX я узнал, что это довольно сложно использовать:

using UnityEngine; 
using UnityEngine.UI; 
using System.Collections.Generic; 
using System.Linq; 
using Pathfinding.Serialization.JsonFx; 
using UnityEditor; 

public class jsonTest : MonoBehaviour 
{ 

public Text text; 
public List<ChapterModel> chapters; 

// Use this for initialization 
void Start() 
{ 
    chapters = new List<ChapterModel>(); 

    for (int i = 0; i < 2; i++) 
    { 
     var cm = new ChapterModel(); 
     cm.pages = new List<PageModel>(); 
     cm.id = i; 

     for (int j = 0; j < 2; j++) 
     { 
      var pm = new PageModel(); 
      pm.BackgroundArt = j.ToString(); 
      cm.pages.Add(pm); 
     } 

     chapters.Add(cm); 
    } 

    string json = JsonWriter.Serialize(chapters); 

    //Will end up in in invalid cast: 
    //var deserialized = JsonReader.Deserialize<List<ChapterModel>(json); 

    //Will be casted to object[] on deserialization: 
    //var deserialized = JsonReader.Deserialize(json, typeof (List<ChapterModel>)); 

    //Will evaluate just fine: 
    var deserialized = JsonReader.Deserialize(json, typeof(List<ChapterModel>)) as object[]; 
    List<ChapterModel> list = deserialized.Select(item => item as ChapterModel).ToList(); 
    Debug.Log(list.Count); 
    } 
} 

[System.Serializable] 
public class ChapterModel 
{ 
    public int id = -1; 
    public List<PageModel> pages; 
} 


[System.Serializable] 
public class PageModel 
{ 
    public string BackgroundArt, 
    ForeAddedArt, 
    VFXloop, VFXappeared, VFXnextSlide, 
    BGAmbientLoop, BGMusicLoop, BGVoiceLoop, 
    VFXSound, MusicSound, VoiceSound; 
} 

Однако, если мы позволим нашим JSON знать typehint, она должна быть тонкой. Что забавно, это не так:

//(...) 
    StringBuilder output = new StringBuilder(); 

    JsonWriterSettings writerSettings = new JsonWriterSettings { TypeHintName = "__type" }; 

    JsonWriter writer = new JsonWriter(output, writerSettings); 
    writer.Write(chapters); 
    JsonReaderSettings readerSettings = new JsonReaderSettings { TypeHintName = "__type" }; 
    JsonReader reader = new JsonReader(output, readerSettings); 

    //Will now see objects inside array as ChapterModel but still will fail to cast properly to list/array of ChapterModels 
    List<ChapterModel> deserialized = reader.Deserialize() as List<ChapterModel>; 
    Debug.Log(deserialized.Count); 

Вы можете играть немного больше с ним или придерживаться уродливых версий я представил выше.

+0

первая уродливая версия в порядке, потому что я не сериализую данные с JsonFX, мне нужно десериализовать JSON, который я получил Json.Net, так что все в порядке, спасибо! – user2686299

+0

Ах, забыл, что ты упомянул об этом в своем первом вопросе. Рад, что он сделал работу и в этом случае! – mwilczynski

Смежные вопросы