unity引用类型序列化_Unity中的序列化与反序列化

Unity的数据存储,本地类 PlayerPrefs, Inspector,以及Prefab等都使用了序列化与反序列化的知识.循序渐进,让我们一步步了解Unity中的序列化和反序列化的知识;流与格式化器序列化: 将对象转换为字节流.反序列化: 将字节流转换为对象.直接讲概念太抽象,我们先来看代码;using UnityEngine;using System.IO;using System.Runt...
摘要由CSDN通过智能技术生成

Unity的数据存储,本地类 PlayerPrefs, Inspector,以及Prefab等都使用了序列化与反序列化的知识.

循序渐进,让我们一步步了解Unity中的序列化和反序列化的知识;

流与格式化器

序列化: 将对象转换为字节流.

反序列化: 将字节流转换为对象.

直接讲概念太抽象,我们先来看代码;

using UnityEngine;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

public class Test : MonoBehaviour

{

private void Start()

{

Hero hero_ins = new Hero();

hero_ins.id = 100;

hero_ins.attack = 99f;

hero_ins.defence = 99f;

hero_ins.name = "Calabash";

Stream st = FormatInstanceToMemory(hero_ins);

st.Position = 0;

hero_ins = null;

hero_ins = MemoryToInstance(st) as Hero;

Debug.Log(hero_ins.id.ToString());

Debug.Log(hero_ins.attack.ToString());

Debug.Log(hero_ins.defence.ToString());

Debug.Log(hero_ins.name);

}

//序列化 把实例对象写入流中

private static MemoryStream FormatInstanceToMemory(object instance)

{

//创建一个流

MemoryStream ms = new MemoryStream();

//创建格式化器

BinaryFormatter bf = new BinaryFormatter();

//序列化为二进制流

bf.Serialize(ms, instance);

return ms;

}

//反序列化, 从流中读出实例对象

private static object MemoryToInstance(Stream st)

{

//创建格式化器

BinaryFormatter bf = new BinaryFormatter();

//把二进制流反序列化为指定的对象

return bf.Deserialize(st);

}

}

关于Hero类的定义如下:

[Serializable] //注意这个关键字

public class Hero

{

public int id;

public float attack;

public float defence;

public string name;

}

代码中的注释已经写得很清楚了,通过代码我们要解释三个概念;

流(Stream): Unity中的二进制数据流,有 MemoryStream, FileStream 等子类来处理不同场景的数据流,但我们这里不讨论每种流的用法,只需要让大家理解 Stream提供了一个用来容纳经过序列化之后的字节块的容器

更多的Stream知识可以查阅这里: Unity的Stream流

格式化器: 使用序列化和反序列的工具,代码中只是使用到了 BinaryFormatter 这种格式化器,其实还有 SoapFormatter (需要导入对应的.dll文件),需要注意的是进行序列化和反序列的操作必须是相同的格式化器,否则可能会抛出System.Runtime.Serialization.SerializationException异常.

[Serializable]特性: 默认自定义的类型是无法被序列化的,需要使用 [Serializable] 特性来实现序列化与反序列化,关于此特性更多的内容见下节;

通过上面的示例,我们往流中写入了一个对象,那么可以写入两个,甚至多个不同的对象么?答案是肯定的,我们还是用代码测试一下;

using UnityEngine;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

public class Test : MonoBehaviour

{

private void Start()

{

Hero hero_ins = new Hero();

hero_ins.id = 100;

hero_ins.attack = 99f;

hero_ins.defence = 99f;

hero_ins.name = "Ca

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值