【问题标题】:Dynamically serialize List to JSON using reflection in Unity在 Unity 中使用反射将 List 动态序列化为 JSON
【发布时间】:2017-05-18 09:01:06
【问题描述】:

我遇到了一个非常复杂的情况,我希望得到一些建议来解决这种情况。所以我之前问过这个问题:Unity save everything (snapshot)

我目前正在尝试将所有内容序列化为 JSON。在序列化所有内容时,我有一些要求。

  1. 我不知道游戏对象附加了哪些组件。
  2. 我不知道这些组件(类)对属性/字段有什么作用。

我成功地序列化了统一的基本类型(变换/网格渲染器等)。不过,我现在正在编写代码来序列化自定义组件。为此,我使用反射。如果类只有主要类型(字符串、整数、浮点数等),则此代码有效。但是我仍然面临两个挑战。

  1. 在不知道其类型的情况下对列表进行序列化(或者至少知道类型但无法根据我的知识动态转换它)
  2. 序列化包含自定义类的字段(以及包含自定义类的列表)。

现在我主要想就第一点获得建议。我开发了这段代码: 类型是我之前得到的字符串

if (type.Contains("List"))
{
    value = serializeListVariable(singular.GetValue(comp));
}

那么这里是应该序列化列表的方法。通过调试,我可以看到对象位于 values 变量中。但是,它们不会被转换为 JSON,而只是返回 {}。在第一次迭代中,我想动态保存主要类型的列表。但后来我也想用自定义类来做到这一点。如果我使用 getvalues 进行 tostring 处理,之后我可以得到一个正确的 JSON 字符串,但话又说回来,我对这些自定义类的 tostring 方法没有影响......

private string serializeListVariable(object listobject)
{
    PropertyInfo listitems = listobject.GetType().GetProperty("Item");
    int listcount = (int)listobject.GetType().GetProperty("Count").GetValue(listobject, null);
    var values =  new object[listcount];
    for (int i =0; i < listcount; i++) {

        values[i] = listitems.GetValue(listobject, new object[] { i });
    }
    string serializedlist = JsonHelper.ToJson(values);
    return serializedlist;
}

被调用的 JSON 辅助方法:

public static string ToJson<T>(T[] array)
{
    Wrapper<T> wrapper = new Wrapper<T>();
    wrapper.Items = array;
    return JsonUtility.ToJson(wrapper);
}

还有提到的包装类:

[Serializable]
private class Wrapper<T>
{
    public T[] Items;
}

希望你们中的一些人知道解决这个问题。

提前致谢!

【问题讨论】:

  • 你试过 json.net 吗?它将通过反射将类的当前状态(带有参数及其值)转换为 json。您可以将 json 反序列化回对象。
  • 这正是我要找的!不幸的是,团结不支持这一点:(
  • 我已经在很多项目中统一使用它 :) 它像奶酪一样工作......从资产商店获取它
  • 我试过了,它适用于原始类型。不幸的是,它不适用于自定义类。
  • 当然对他们有用!它甚至适用于子类型和继承的类。久经考验

标签: c# json list unity3d reflection


【解决方案1】:

在 Unity 中使用 LitJSON 插件。

return JsonMapper.ToJson(anyClassOrList);

【讨论】:

  • 我尝试了 LitJSON 插件,它适用于原始类型。不幸的是,不适用于自定义类。
猜你喜欢
  • 2013-02-04
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2015-06-07
  • 2018-01-09
  • 1970-01-01
  • 2021-04-19
相关资源
最近更新 更多