【问题标题】:Can't load a List of object (<Item>) to firebase realtime database无法将对象列表 (<Item>) 加载到 firebase 实时数据库
【发布时间】:2021-06-17 19:43:53
【问题描述】:

我正在使用 unity c# 开发 2D 游戏应用程序。

我有一个项目(对象)列表,每个项目包含双倍价格、双倍乘数和 int 级别。

我正在尝试使用 json 将该列表加载到 FireBase 实时数据库,以保存玩家的个人商店。 尝试让它在数据库中看起来像这样:

这是我的 Item 类:

public class Item
{
    
    public double Price {get; set;}
    public double Multiplier { get; set; }
    public int Level { get; set; }
    

    public Item(double price, double multiplier, int level)
    {
        this.Price = price;
        this.Multiplier = multiplier;
        this.Level = level;
    }
}

这是我的 Shop 课程:

public class Shop
{
    public List<Item> ShopList { get; set; }

    public Shop()
    {
        this.ShopList = new List<Item>();
    }

    public void InitShop()
    {
        string[] lines = System.IO.File.ReadAllLines(@"Assets\Scripts\Data\ShopData.txt");
        foreach (string line in lines)
        {
            string[] words = line.Split(',');
            double price = Convert.ToDouble(words[0]);
            double mul = Convert.ToDouble(words[1]);
            int level = Convert.ToInt32(words[2]);
            Item i = new Item(price, mul, level);
            this.ShopList.Add(i);
        }
    }

【问题讨论】:

    标签: c# firebase unity3d firebase-realtime-database


    【解决方案1】:

    如果你打算使用 Json 创建你的保存系统,你也可以使用 Unity 提供的 JsonUtitlity。有了这个,您可以自动创建一个 json 格式的保存数据对象并保存它。

    API 参考: https://docs.unity3d.com/ScriptReference/JsonUtility.html

    Youtube 教程(代码猴子): https://www.youtube.com/watch?v=6uMFEM-napE

    如果您不介意使用第三方 dll,您可能需要查看 Newtonsoft https://www.newtonsoft.com/json

    【讨论】:

    • 我发现 JsonUtitlity 在使用 object 类型时出现故障。它没有正确转换它。
    【解决方案2】:

    当你从实时数据库读取到 Unity 时,它会将类型数据保留为关键字,这对JSON.parse() 来说是有问题的 这些最有可能导致您的代码出现问题,有一个 JSON.parser 可以处理这个问题,目前我无法在脑海中找到脚本。

    社区的另一种选择是将其转换为字典

    Dictionary<string, object> dict = new Dictionary<string, object>();
    foreach (DataSnapshot child in snapshot.Children)
    {
        dict.Add(child.Key, child.Value);
    }
    

    【讨论】:

      【解决方案3】:

      我建议使用 NewtonSoft /Json.Net for Unity。可以在这里找到包装:

      https://assetstore.unity.com/packages/tools/input-management/json-net-for-unity-11347

      像这样工作:

      string ConvertToJson(object obj) 
      {
          return JsonConvert.SerializeObject(obj);
      }
      
      string ConvertFromJson<T>(string json)
      {
          return JsonConvert.DeserializeObject<T>(json);
      }
      
      
      void Usage() 
      {
          List<object> myList = populateListWithSomeData();
          
          // Save it
          var json = ConvertToJson(myList);
          SaveInDatabase(json);
          
          // Load it
          var json = LoadFromDatabase();
          myList = ConvertFromJson<List<object>>(json);
      }
      

      【讨论】:

      • 首先,没有“序列化”和“反序列化”这行return JsonConvert.DeserializeObject&lt;T&gt;(json);不工作,它写道它不能将转换为字符串
      • T在编程中是一个通用术语。这意味着您可以放入任何您想要的东西。如果你想要一个字符串,那么写:JsonConvert.DeserializeObject(json)。这应该是多余的,因为 json 已经是一个搅拌器。这是文档:newtonsoft.com/json/help/html/SerializingJSON.htm
      猜你喜欢
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      相关资源
      最近更新 更多