Unity - A计划(永久有效期) 扫二维码继续学习 二维码时效为半小时

(196评价)
价格: 4059.00元
将一个对象的值赋值为null的时候,将其序列化依然显示其指向一个对象,怎么解决这个问题?
兼爱非攻发起了问答2018-02-10
7
回复
1146
浏览

假设我当前有一个类:

public class temp{  public string name="123"; }

再创建一个类,并定义2个变量:

public class MY{ public temp t1;   public temp t2;  }

然后在别的脚本的方法里写入如下代码:

public MY my=new MY();

赋值:

my.t1=new temp();

然后将t1赋值给t2,再将t1赋值为空

my.t2=my.t1;

my.t1=null

这个时候我将对象my序列化成字符串,结果发现这个字符串里不仅有应该有的t2对象,同时已经赋值为null的t1也依然在,这什么情况?怎么解决这个问题? 

 

现在明明t1的值已经是null了,为什么还会序列化出他以前指向的那个对象来呢? 怎么才能在序列化的时候真实的把他的值解析成null?

所有回复
  • 老师_Bathur 2018-02-10

    您好~您采用的何种方式序列化的呢?

    可以在序列化前先打印一下每个值看一下,再对比一下序列化结果确定问题

    • 兼爱非攻 2018-02-11

      打印值必然是null了,但是序列化后他的值对应的是一个空对象,并非是null,这个对象内的所有值都是默认值。我使用的是JsonUtiliti,因为直接用系统自带的方便些,比如以我上面为例,你将temp对象赋值为空的时候再去print或debug.log必然都是显示为null的,但如果你将其序列化后显示序列化好的json文本就会发现他的值是一个temp对象,只不过这个temp的name值为空,除非在运行过程中这个temp对象从未被赋值过,也就是说从来没有让它指向任何一个temp对象也从来没有为他new过temp对象,如果是这样的话序列化出来的json文本在对应的值内是直接显示空的而不是一个temp对象

      (0) 回复
    • 兼爱非攻 2018-02-11

      我是经常多次测试才会来这提问的,如果打印出来值不是null那说明他的值本来就不为空,犯这种低级错误我不会来这问老师的哈

      (0) 回复
    还有-3条回复,点击查看
    你还没有登录,请先登录注册
  • 老师_Bathur 2018-02-11

    您好~只是追加询问一些详细情况而已,老师觉得是JsonUtility自身的问题哦,老师使用LitJson重现了您所提到的步骤。

    如图,结果并不存在异常,自带的JsonUtility局限性和问题还是不少的

    • 兼爱非攻 2018-02-22

      用LitJson当然不会存在这个问题啦。。。这个JsonUtility有点坑啊,原本想直接使用自带的JsonUtility方便些。

      (0) 回复
    • 兼爱非攻 2018-02-22

      抱歉了我好像没在提问中提及是使用JsonUtility才导致这种结果的...

      (0) 回复
    • 老师_Bathur 2018-02-23

      回复 @ 兼爱非攻: 您在追问中提及啦~jsonutility目前确实还不太好用~

      (0) 回复
    还有-2条回复,点击查看
    你还没有登录,请先登录注册
发表回复
你还没有登录,请先 登录或 注册!