unity自带的JsonUtility,反序列化时,对象中的集合内不能包含枚举类型

最近在学习一门课,UI框架,遇到一个反序列化的问题,
笔者需求读取json中的配置文件,使用unity自带的fromjson方法,数据对象的结构如下:
unity自带的JsonUtility,反序列化时,对象中的集合内不能包含枚举类型_第1张图片
经过一系列操作,反序列化获取到的list一直为null。。。
然后实在不知道咋回事了,巴拉巴拉,就是说,自定义的这个枚举类型UIPanelTYpe,是无法进行反序列化的。(可能是因为这门课太久了,老师整了三节课,才发现这个问题

好了,那就开始改造,在unity引擎内有一个接口叫做:ISerializationCallbackReceiver。
这个接口包含两个实现方法,
OnAfterDeserialize():在反序列化之后调用;
OnBeforeSerialize():在序列化之前调用。

OK,为了使用枚举类型,使PanelInfo继承至这个接口,再定义一个string类型的字段代替枚举,使枚举类型不能被序列化。然后在OnAfterDeserialize()内,把string类型转换为emum,赋值给UIPanelTYpe类型的字段。修改代码如下:

[Serializable]
public class UIPanelInfo
{
     
    public List<PanelInfo> PanelInfoList = new List<PanelInfo>();
}

[Serializable]
public class PanelInfo:ISerializationCallbackReceiver
{
     
    [NonSerialized]
    public UIPanelType PanelType;

    public string PanelTypelString;
    public string Path;

    public void OnAfterDeserialize()
    {
     
        UIPanelType type = (UIPanelType)Enum.Parse(typeof(UIPanelType),PanelTypelString);
        PanelType = type;
    }

    public void OnBeforeSerialize()
    {
     
        
    }
}

测试,完美解决,这样就能在序列化对象内使用枚举类型的字段咯。。。真是个很好的解决办法呢,所以还是不建议使用unity自带的这个方法,LitJson是个好工具,下次使用它,就能轻松点儿了!!

你可能感兴趣的:(C#与unity,c#,unity)