我从Car类型生成一个JSON表示,然后从该json创建一个System.Object。当我尝试将该对象显式转换为Car类型时,它显示错误“ InvalidCastException:指定的转换无效”。谁能向我解释原因?
using System;
using UnityEngine;
[Serializable]
class Car
{
public string type;
}
public class Test : MonoBehaviour
{
void Start()
{
Car car = new Car();
car.type = "BMW";
string json = JsonUtility.ToJson(car);
System.Object @object = JsonUtility.FromJson<System.Object>(json);
car = (Car)@object;
Debug.Log(car.type);
}
}
答案 0 :(得分:0)
您要在此处进行的操作称为“向下/向上投射”。
在c#中,object
是所有其他类型的父类。因此,您只需分配一个继承的类型(例如在这种情况下,将Car
分配给object
)变量即可。这称为 Upcast 。
然后,当尝试从更通用的类型转换为更具体的类型(在您的情况下,从object
转换为Car
时,这称为 Downcast 。
您只能直接将object
(btw只是类型关键字和System.Object
的别名)转换为Car
。如果以前,这实际上是是Car
参考,例如
Car car = new Car();
car.type = "BMW";
//string json = JsonUtility.ToJson(car);
//System.Object @object = JsonUtility.FromJson<System.Object>(json);
object @object = car;
car = (Car)@object;
Debug.Log(car.type);
从现在起@object
仍将继续为Car
保留信息,但是装箱到object
中。
您不能使用
System.Object @object = JsonUtility.FromJson<System.Object>(json);
System.Object
不可序列化,并且在这里绝对不适合作为目标类型,因为类型object
也不包含有关要反序列化的字段的信息。您想要的是Car
而不是object
。
所以您可以使用的是
// Here the Car reference returned by FromJson is BOXED into object
System.Object @object = JsonUtility.FromJson<Car>(json);
// Since @object is still a boxed Car value it is now UNBOXED from object to Car
car = (Car)@object;
但是,为什么整个投射全部 ?您真的想使用
car = JsonUtility.FromJson<Car>(json);