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个。我们在进行序列化的创建的时候,一个非常常见的错误就是通过序列化构造一个类似树状结构的数据结构,在我们声明的序列化类里面,如果还有包含本身的对象,类似于
[Serializable]
public class DepthClass : ScriptableObject
{
public List<DepthClass> depthObjects;
}
上诉的这种序列化结构,就会产生我之前所示的系统报错。有效的避免空值的序列化,对于树状结构包括字典的存储,我采用的是List key的存储方式,对下一个子节点,都用字符串作为一个key值来存储,然后将所有的节点都存储在一个List中。这样我们通过key来寻找节点,其中我们可以采用堆存储或者更加高效的查询方式,来避免效率的底下。目前还没有想到更好的解决方法。。。23333
unity序列化的更多相关文章
- Unity 序列化 总结
查找了 Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http:// ...
- Unity 序列化
Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http://docs ...
- unity 序列化和反序列化
什么是序列化和反序列化(1)序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程:. (2)序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可 ...
- 玩转Unity资源,对象和序列化(下)
本文将从Unity编辑器和运行时两个角度出发,主要探讨以下两方面内容:Unity序列化系统内部细节以及Unity如何维护不同对象之间的强引用.另外还会讨论对象与资源的技术实现差别. 译注:除非特别说明 ...
- 玩转Unity资源,对象和序列化(上)
这是一系列文章中的第二章,覆盖了Unity5的Assets,Resources和资源管理 本文将从Unity编辑器和运行时两个角度出发,主要探讨以下两方面内容:Unity序列化系统内部细节以及Unit ...
- Unity AssetBundles and Resources指引 (三) AssetBundle基础
本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and- ...
- Unity AssetBundles and Resources指引 (一)
本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and- ...
- Unity3D的SerializeField 序列化域名
SerializeField Inherits from Attribute Force Unity to serialize a private field. 强制Unity去序列化一个私有域. Y ...
- C#使用ProtocolBuffer(ProtoBuf)进行Unity中的Socket通信
首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Uni ...
随机推荐
- [ROR] 如何在mixin模块中定义类方法(Howto define class methods in a mixin module)
方法一: 修改模块的include方法 module Bbq def self.included(base) base.send :include, InstanceMethods base.exte ...
- linux清理系统缓存
Linux 内存优化. 1.清理前内存使用情况 free -m 2.开始清理 echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成 ...
- springboot使用Fiber纤程踩过的坑
@RequestAttribute为null 在springboot中使用@FiberSpringBootApplication注解标注在SpringBootApplication上时,发现在拦截器( ...
- Go语言入门——interface
1.Go如何定义interface Go通过type声明一个接口,形如 type geometry interface { area() float64 perim() float64 } 和声明一个 ...
- Idea 热部署插件JRebel 安装与环境配置-上海尚学堂Java培训
在企业日常项目开发中,如果我们需要调试一个Java Web项目,就需要先将项目编译之后,放入Web容器或借助Maven web 插件来运行,如果对Java源代码进行修改,那么必须重新编译并重启Web容 ...
- 浏览器渲染html的过程
关于浏览器如何渲染html界面一直不太清晰,所以现在理一理.由于本身对前深入的东西不太清晰,这篇博客更多的是在记录. 参考:https://www.cnblogs.com/dojo-lzz/p/398 ...
- Junit测试入门
junit测试的6大注解 @BeforeClass 最先执行,在整个测试类中只会执行一次,所以它只能声明一次,并且被它标注的方法必须声明为static @Before 可以声明多个方 ...
- 用Java的大整数类BigInteger来实现大整数的一些运算
关于BigInteger的构造函数,一般会用到两个: BigInteger(String val); //将指定字符串转换为十进制表示形式: BigInteger(String val,int rad ...
- P1850 换教室[dp+期望]
流下了不会概率的眼泪,由于不会概率,转移少写了点东西... 这个dp很简单,就是一个普通的线性dp加点期望.(刚开始写这道题时信笔写下) \(dp[0/1][i][j]\)表示到第\(i\)个时间段时 ...
- C++输入输出流 cin/cout 及格式化输出简介
C++ 可通过流的概念进行程序与外界环境( 用户.文件等 )之间的交互.流是一种将数据自源( source )推送至目的地( destination )的管道.在 C++ 中,与标准输入/输出相关的流 ...