【发布时间】:2017-05-18 09:01:06
【问题描述】:
我遇到了一个非常复杂的情况,我希望得到一些建议来解决这种情况。所以我之前问过这个问题:Unity save everything (snapshot)
我目前正在尝试将所有内容序列化为 JSON。在序列化所有内容时,我有一些要求。
- 我不知道游戏对象附加了哪些组件。
- 我不知道这些组件(类)对属性/字段有什么作用。
我成功地序列化了统一的基本类型(变换/网格渲染器等)。不过,我现在正在编写代码来序列化自定义组件。为此,我使用反射。如果类只有主要类型(字符串、整数、浮点数等),则此代码有效。但是我仍然面临两个挑战。
- 在不知道其类型的情况下对列表进行序列化(或者至少知道类型但无法根据我的知识动态转换它)
- 序列化包含自定义类的字段(以及包含自定义类的列表)。
现在我主要想就第一点获得建议。我开发了这段代码: 类型是我之前得到的字符串
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