C#中的序列化和Unity中的序列化

什么是序列化和反序列化?

序列化(Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。
本质就是讲信息按照一定格式二进制化(字节序列),从而可以进行存储或者传输

方便持久化存储到磁盘,避免程序运行结束后对象就从内存里消失,另外变化成字节序列也更方便网络运输和传播。

  • 序列化:将对象(object)转化为二进制字节序列

  • 反序列化:将二进制字节序列转化为对象(object)

  • 序列化不一定会保存到文件或数据库中,可能只在内存中
    在这里插入图片描述

  • 进阶理解

    • 序列化可以用于跨平台。实际上就是把一段数据翻译成(序列化)比较底层的语言(如汇编、机器语言),而基于这个底层语言再可以翻译(反序列化)成多种上一层的语言。
    • 两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。

可以简单的理解序列化的目的就是为了跨进程传递格式化数据

对于游戏领域来说,序列化讲的是游戏中的数据写进文件,包括角色的生命、攻击、防御等等,这样当游戏需要调整时(比如平衡性问题),就只需对文件进行改写,而不需要讲游戏重新进行编译、玩家在更新的时候也只需要下载几个被改写的文件即可

序列化有什么作用?

传输数据。比如网络中只能传递二进制字节流。

  • 将对象的状态保持在存储媒体中,以便在以后重新创建精确的对象信息(不是唯一手段)
  • 可以通过字节流在不同应用程序域中传递
Unity序列化

Unity会自动序列化所有你自己写的脚本组件(Scriptable Object), 重载新的程序集,并且重新创建你的脚本组件。简单的说,序列化后,数据就可以被保存了。Unity序列化过程不走.NET的方法,而是Unity内部的方法。

序列化后的数据具有持久存储的特性,简单理解只要是在Inspector窗口中暴露出来的字段都是序列化后的结果

能序列化的类型不能序列化的类型
C#原生数据类型(int/string/enum)抽象类
Unity内置数据类型(Vector/Rect/Color)静态类
继承自UnityEditor.Object泛型类
标记了[Serializable]属性的类没有标记[Serializable]属性的类
Array,List容器其他容器

  • [Serializable]和[SerializeField]是一对好兄弟,一个是用来序列化类和结构体,一个是用来序列化属性成员的。
  • 对象序列化后具有持久保存的特点,Unity提供了两种将持久数据保存成文件的操作(包括读取)
    1. 通过xml,json等序列化Serialize和反序列化DeSerialize操作
    2. Unity提供的ScriptableObject

  • SerializeField : 表示变量可被序列化。众所周知,公有变量可以在检视面板中看到并编辑,而私有和保护变量不行。SerializeField与private,protected结合使用可以达到让脚本的变量在检视面板里可视化编辑,同时保持它的私有性的目的。
  • HideInInspector : 将原本显示在检视面板上的序列化值隐藏起来。
  • NonSerialized :通过此方法可以将一个公有变量不序列化并且不显示在检视面板中。
  • Serializable:用在类的前面,表示该类可被序列化。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值