最近在学习一门课,UI框架,遇到一个反序列化的问题,
笔者需求读取json中的配置文件,使用unity自带的fromjson方法,数据对象的结构如下:
经过一系列操作,反序列化获取到的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是个好工具,下次使用它,就能轻松点儿了!!