什么是序列化

  • 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个。我们在进行序列化的创建的时候,一个非常常见的错误就是通过序列化构造一个类似树状结构的数据结构,在我们声明的序列化类里面,如果还有包含本身的对象,类似于

    [Serializable]
    public class DepthClass : ScriptableObject
    {
    public List<DepthClass> depthObjects;
    }

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

unity序列化的更多相关文章

  1. Unity 序列化 总结

    查找了 Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http:// ...

  2. Unity 序列化

    Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs ...

  3. unity 序列化和反序列化

    什么是序列化和反序列化(1)序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程:.  (2)序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可 ...

  4. 玩转Unity资源,对象和序列化(下)

    本文将从Unity编辑器和运行时两个角度出发,主要探讨以下两方面内容:Unity序列化系统内部细节以及Unity如何维护不同对象之间的强引用.另外还会讨论对象与资源的技术实现差别. 译注:除非特别说明 ...

  5. 玩转Unity资源,对象和序列化(上)

    这是一系列文章中的第二章,覆盖了Unity5的Assets,Resources和资源管理 本文将从Unity编辑器和运行时两个角度出发,主要探讨以下两方面内容:Unity序列化系统内部细节以及Unit ...

  6. Unity AssetBundles and Resources指引 (三) AssetBundle基础

    本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and- ...

  7. Unity AssetBundles and Resources指引 (一)

    本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and- ...

  8. Unity3D的SerializeField 序列化域名

    SerializeField Inherits from Attribute Force Unity to serialize a private field. 强制Unity去序列化一个私有域. Y ...

  9. C#使用ProtocolBuffer(ProtoBuf)进行Unity中的Socket通信

    首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Uni ...

随机推荐

  1. Java自学-接口与继承 接口

    设计Java的接口 在设计LOL的时候,进攻类英雄有两种,一种是进行物理系攻击,一种是进行魔法系攻击 这时候,就可以使用接口来实现这个效果. 接口就像是一种约定,我们约定某些英雄是物理系英雄,那么他们 ...

  2. Vue搭建脚手架1

    Vue2.0搭建Vue脚手架(vue-cli) 此文章参考了网上一些前人的技术分享,自己拿过来总结一下.此文章是基于webpack构建的vue项目,并实现简单的单页面应用.其中利用到的相关技术会简单加 ...

  3. 27、获取图片验证需要的uuId

    export function getUUID() {    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => ...

  4. Centos7无法使用ssh登陆及解决方案

    查看状态: systemctl status sshd.service 启动服务: systemctl start sshd.service 重启服务: systemctl restart sshd. ...

  5. 【转】在Keil uv5里面添加STC元器件库,不影响其他元件

    先到网上下载stc.CBD(http://download.csdn.net/detail/mao0514/9699117) 还有STC新系列单片机的头文件,宏晶的网站就有 1.在Keil/C51/I ...

  6. 浅谈布隆过滤器Bloom Filter

    先从一道面试题开始: 给A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL. 这个问题的本质在于判断一个元素是否在一个集合中.哈希表以O(1) ...

  7. PS用户配置服务连接出错

    PS用户配置服务连接出错 [2019-07-30 14:58:25.475]-[INFO ]-[xxxx.profileserver.service.ProfileServerImpl:1430][1 ...

  8. 通用工业协议(CIP)形式化的安全分析(前期概念的梳理)

    1.CIP的概念的梳理 CIP是为开放的现场总线DeviceNet ControlNet   EtherNet/IP 网络提供公共的应用层和设备描述, CIP是基于对象的协议,使用生产者/消费者模型, ...

  9. 2019年杭电多校第二场 1012题Longest Subarray(HDU6602+线段树)

    题目链接 传送门 题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于\(K\). 思路 我们通过固定右端点考虑每个左端点的情况. 首先对于每个位置,我们用线段树来维护它作为\(C\)种元素 ...

  10. wordpress时间函数the_time() 实例解读

    wordpress the_time()时间函数想必大家多多少少都会用到,但是要自定义一些时间相对没那么熟悉了,随ytkah一起来看看吧.我们知道时间函数基础调用是<?php the_time( ...