unity序列化

###什么是序列化

  • unity的序列化在unity的开发中起着举重足轻的地位,许多核心的功能都是基于序列化和反序列化来实现的。序列化简单来讲就是就是将我们所要保存的数据进行二进制存储,然后当我们需要的时候,在读取二进制文件,反序列化回来。下面是一些常用的序列化的例子:

    • 存储脚本化的数据。在我们的c#代码中,可以将我们所要存储的数据进行序列化,进行存储
    • prefab与初始化。在unity开发过程中我们会制作很多的预制体(prefab),这些prefab都是序列化,以二进制的形式保存的。当你要对预制体进行初始化的时候,unity根据之前序列化的信息新建出一个物体,然后将物体上的信息反序列化回去,实现类似于clone的效果。
    • 在unity编辑器的拓展功能,AssetBundle等等,都可以看到序列化的身影。
  • 可序列化对象

    • 公有的,或者有[SerializeField]属性,非静态,非常量,非只读
    • 自定义非抽象类,并且有Serializable属性
    • 继承自unity.object的类
    • 数组和List

    注意:

    • 字典不能通过添加Serializable属性进行序列化
    • 如果一个类基类不能被序列化,那它即便添加了序列化特性也无法被序列化
    • 序列化不能保存另一个要反序列化的对象指针,因为反序列化是new一个新的对象,指针指向的内存将不会是原对象
  • 可采用unity编辑器的序列化类ScriptableObject,当我们继承这个基类,我们就可以调用unity给我们的接口进行序列化了。具体的序列化接口可以到unity的官方接口文档上查看使用方法,这里不具体介绍。

  • 下面来讲讲具体开发过程中个人遇到的坑

    • 首先给出一段开发过程中的报错信息

      Serialization depth limit 7 exceeded at 'XNodeScripts::ConfigNode.nodeList'. There may be an object composition cycle in one or more of your serialized classes.

      Serialization hierarchy: 8: XNodeScripts::ConfigNode.nodeList 7: XNodeScripts::ConfigNode.nodeList 6: XNodeScripts::ConfigNode.nodeList 5: XNodeScripts::ConfigNode.nodeList 4: XNodeScripts::ConfigNode.nodeList 3: XNodeScripts::ConfigNode.nodeList 2: XNodeScripts::ConfigNode.nodeList 1: XNodeScripts::ConfigNode.nodeList 0: XNodeScripts::SelectMsgNode.rootNode

    这里的报错信息提示我们我在创建序列化数据nodeList的时候,可能是在这个nodeList里面有循环的序列化。这边我们发现unity还提示我们序列化的深度为7。我在网上查到,原来我们的子系统是构建在序列化系统之上的,所以如果放任其死循环的序列化的话,当一个非常大的序列化流将导致整个系统崩溃。为了避免这样的情况,unity采用了一个深度为7的阙值,及循环序列化为空的子集最多只能为7个。我们在进行序列化的创建的时候,一个非常常见的错误就是通过序列化构造一个类似树状结构的数据结构,在我们声明的序列化类里面,如果还有包含本身的对象,类似于

    1[Serializable] 2public class DepthClass : ScriptableObject 3{ 4 public List<DepthClass> depthObjects; 5}

    上诉的这种序列化结构,就会产生我之前所示的系统报错。**有效的避免空值的序列化,**对于树状结构包括字典的存储,我采用的是List<string> key的存储方式,对下一个子节点,都用字符串作为一个key值来存储,然后将所有的节点都存储在一个List中。这样我们通过key来寻找节点,其中我们可以采用堆存储或者更加高效的查询方式,来避免效率的底下。目前还没有想到更好的解决方法。。。23333

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

IOS中对象序列化与反序列化

概述在IOS中,对象的序列化和反序列化分别使用NSKeyedArchiver和NSKeyedUnarchiver两个类,我们可以把一个类对象进行序列化然后保存到文件中,使用时再读取文件,把内容反序列化出来。这个过程通常也被称为对象的编码(归档)和解码(解档)。需要注意的是,NSKeyedArchiver和NSKeyedUnarchiver是继

Gson 数据解析

gson和其他现有javajson类库最大的不同时gson需要序列化的实体类不需要使用annotation来标识需要序列化的字段,同时gson又可以通过使用annotation来灵活配置需要序列化的字段。下面是一个简单的例子:1.public class Person {3.private String name;

unity 序列化和反序列化

什么是序列化和反序列化(1)序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程;. (2)序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了对象的状态以及相关的描述信息。序列化机制

JFinal的Model进行json反序列化

在使用JFinal进行开发时,我们可能会需要解决这样的问题:Model进行json的序列化与反序列化。官方已经提供了序列化的方法Model.toJson()非常方便,反序列化就得自己实现一下了。之前我一直都是把Model序列化成的json字符串,反序列化成map,然后再调用Model.setAttrs(map)。这样就有类型转换问题,最后反序列化得到

Java序列化——transient关键字和Externalizable接口

  提到Java序列化,相信大家都不陌生。我们在序列化的时候,需要将被序列化的类实现Serializable接口,这样的类在序列化时,会默认将所有的字段都序列化。那么当我们在序列化Java对象时,如果不希望对象中某些字段被序列化(如密码字段),怎么实现呢?看一个例子:import java.io.Serializable;imp