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

(197评价)
价格: 4431.00元
关于序列化和反序列化的问题
Everness发起了问答2017-03-24
9
回复
823
浏览

siki老师,我接触到序列化和反序列化这个名词已经半年以上了,期间也查了些资料,但是因为平时用的不多,所以一直没有搞明白这两种行为到底是有什么用。什么叫序列化,什么叫反序列话。

我现在对这个的理解是:这个东西是和数据有关,序列化可以将数据添加入内存中,并且好像还可以直接进行一定程度的记忆。(例如:我制作了一个空的只有transform组件的预设体,之后在游戏运行中创建了这个预设体的实例,并且给它添加了一个脚本,这个脚本中有一个参数设置了序列化的特性。在运行过一遍之后,在Project面板检查这个预设体,就会发现这个预设体上被添加了上面那个脚本)

我看您的UI框架课程上面也用到了序列化和反序列话,请您能通俗的解释下这两个过程是做什么的吗?最好能举个简单点的类比例子。

还有就是通常都是什么情况下使用序列化和反序列化?因为我目前测试这个东西可以让private变量显示在检视体面板,不过经过初步测试,好像只能使简单型的变量显示在面板上(比如int或者string这种),复制点的class变量就不会显示了。虽然我看有人说是为了调节测试方便才这么做的,但是看您的UI框架课程里不是为了调试才使用的。

最后的问题就是我看到有人把SerializeField跟HideInInspector这两种特性一起使用。这个我看过说明但是还是一头雾水,因为说明里也充斥着序列化这个名词,所以我看着也有点懵。另外SerializeField这个特性是个序列化域的概念,这个域又指的是什么?希望老师能帮我解答下。谢谢。

所有回复
  • siki 2017-03-25

    序列化指的是 把一个内存中的对象转变成文件保存到本地, 这样就实现了持久化,即使电脑关机重启,这个对象已然存在于本地,可以随时读取,这就是序列化,序列化用来实现持久化

    反序列化就是把上面提到的文件读取成一个对象,  这里的对象是存在于内存中,  当电脑关闭或者重启的时候,内存被清空里面的所有数据也不复存在, 

    还有-5条回复,点击查看
    你还没有登录,请先登录注册
  • siki 2017-03-25

    在unity里面可以吧序列化理解为可以通过inpector面板进行修改

    其他地方一般序列化都是用来把一个对象数据保存到本地,或者把一个对象数据序列化之后进行数据传输 

    保存到本地是序列化  转换成json格式和xml格式也是序列化的一种形式

    还有-5条回复,点击查看
    你还没有登录,请先登录注册
  • siki 2017-03-25

    SerializeField 就是这个字段可以保存,不然是不保存的,  不是序列化字段  反序列化后这个字段是没有任何数据的

    • Everness 2017-03-27

      就是说只要标注有SerializeField这个的变量的脚本就会被进行本地保存?那么SerializeField和HideInInspector一起使用又是什么意思?

      (0) 回复
    • Everness 2017-03-27

      还有一个问题就是使用SerializeField是不是就和public类似?只不过使用了SerializeField的private变量无法在类之间进行传递

      (0) 回复
    还有-3条回复,点击查看
    你还没有登录,请先登录注册
  • Everness 2017-03-27

    比如说这两个解释,既然SerializeField是可以进行保存,但为什么加了HideInInspector就说是不保存的?HideInInspector不是只是对面板进行隐藏吗?还有就是为什么要分功夫去同时用这两个特性?既然不想保存就直接private不就可以了?

    而且后面那个4的解释跟3的代码好像一样,但为什么就说3是可以在面板看到而4里面是不能在面板里看到?

    • Everness 2017-03-27

      因为我目前测试了一下,发现只要加了HideInInspector的变量,都不会在面板显示,所以这样的话3的解释就有些问题了

      (0) 回复
    还有-4条回复,点击查看
    你还没有登录,请先登录注册
  • siki 2017-03-27

    HideInInspector  只是控制是否显示在Inspector面板上,跟保存与否没有关系

    SerializeField 用来表示一个字段是序列化字段的,应该也就是你说的能保存

    有的时候一个字段是private的,不想在外边通过程序修改,但是想通过inspector修改,所以会加上SerializeField 

    一般加了SerializeField就不回在加HideInInspector ,这样做没有任何意义

    • Everness 2017-03-27

      哦,大概明白了,因为我看我们同学公司的主程在代码片段里面也同时对一个变量使用了HideInInspector和SerializeField特性,另外网上也有同时使用的,所以就很乱,如果您说同时用没意义的话单独使用我还是大致清楚的。

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