InvalidCastException:指定的强制转换在Unity中无效

时间:2019-11-15 09:41:35

标签: c# json unity3d

我从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);
    }
}

1 个答案:

答案 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);