unity篇-官方序列化接口 ISerializationCallbackReceiver
unity篇-官方序列化接口 ISerializationCallbackReceiver
标签(空格分隔): unity
- unity篇-官方序列化接口 ISerializationCallbackReceiver
- 简介
- 官方提供的解决方案
- Dictionary的序列化的泛型解决方案
简介
在unity中,序列化一直是个很头疼的问题,尽管官方支持了许多类型,但一些自定义类型和常用,比如Dictionary不能序列化,让人大呼头疼。不过幸运的是,ISerializationCallbackReceiver的出现解决了这个问题。
官方提供的解决方案
编写一个类继承ISerializationCallbackReceiver接口,通过编写2个回调让List类型代替Dictionary参与序列化
using UnityEngine;
using System;
using System.Collections.Generic;public class SerializationCallbackScript : MonoBehaviour, ISerializationCallbackReceiver
{public List<int> _keys = new List<int> { 3, 4, 5 };public List<string> _values = new List<string> { "I", "Love", "Unity" };//Unity doesn't know how to serialize a Dictionarypublic Dictionary<int, string> _myDictionary = new Dictionary<int, string>();public void OnBeforeSerialize(){_keys.Clear();_values.Clear();foreach (var kvp in _myDictionary){_keys.Add(kvp.Key);_values.Add(kvp.Value);}}public void OnAfterDeserialize(){_myDictionary = new Dictionary<int, string>();for (int i = 0; i != Math.Min(_keys.Count, _values.Count); i++)_myDictionary.Add(_keys[i], _values[i]);}void OnGUI(){foreach (var kvp in _myDictionary)GUILayout.Label("Key: " + kvp.Key + " value: " + kvp.Value);}
}
Dictionary的序列化的泛型解决方案
但我们在unity使用Dictionary实在太频繁,不可能为每个类继承接口编写回调,一位牛人使用泛型编程为我们解决了这个问题
public class SerializationDictionary<TKey, TValue> : ISerializationCallbackReceiver
{[SerializeField]private List<TKey> keys;[SerializeField]private List<TValue> values;private Dictionary<TKey, TValue> target;public Dictionary<TKey, TValue> ToDictionary() { return target; }public SerializationDictionary(Dictionary<TKey, TValue> target){this.target = target;}public void OnBeforeSerialize(){keys = new List<TKey>(target.Keys);values = new List<TValue>(target.Values);}public void OnAfterDeserialize(){var count = Math.Min(keys.Count, values.Count);target = new Dictionary<TKey, TValue>(count);for (var i = 0; i < count; ++i){target.Add(keys[i], values[i]);}}
}
泛型实在太有魅力了,我等懒人必会之
unity篇-官方序列化接口 ISerializationCallbackReceiver相关推荐
- Unity中的序列化和反序列化
一:前言 序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程.序列化最主要的用途就是传递对象和保存对象 在Unity中保存和加载.prefab.scene.Inspecto ...
- Unity对象和序列化原理介绍
Unity使用了很多年了,在这里我敢说很多人对Unity对象和序列化原理并不是很清楚,比如Asset与Object之间有啥区别?如何管理Asset?Unity的序列化是咋回事等等,还有在项目中遇到资源 ...
- php serializable,PHP自定义序列化接口Serializable用法分析讲解
这篇文章主要介绍了PHP自定义序列化接口Serializable用法,结合实例形式分析了Serializable自定义序列化接口的概念.功能.定义及使用方法,需要的朋友可以参考下 本文实例讲述了PHP ...
- Hadoop详解(三)——MapReduce原理和执行过程,远程Debug,Writable序列化接口,MapReduce程序编写
MapReduce概述 MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. MR由两个阶段组成:Map和Reduce,用户只需要实现map()和Re ...
- Java篇 之 序列化与反序列化
一.什么是序列化和反序列化 序列化:指把内存中的Java对象,通过某种方式存储到磁盘中或者传递给其他网络节点,通俗来说就是将对象转化为二进制串. 反序列化:把磁盘中的对象数据或者网络节点上的对象数据, ...
- Java序列化接口的作用总结1
一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做"持久化". 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从 ...
- Java序列化接口Serializable接口的作用总结
一.Java序列化接口Serializable的作用: 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做"持久化". 对象的默认序列化机制写入的内容是:对象的类,类签名, ...
- Mybatis逆向工程的pojo实现序列化接口代码
情景如下,这两天在做一个分布式的项目,使用了Alibaba的dubbo作为通信工具,zookeeper作为register,由于dubbo是基于socket协议的,所以在进行pojo传输的时候报了异常 ...
- Java序列化接口的作用总结
一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做"持久化". 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从 ...
- 【java基础,IO合集】文件流、高级流(缓冲流、对象流)、 序列化接口java.io.Serrializable
目录 文件流 1 块读写的文件复制操作 2 文件输出流-覆盖模式 3 文件输出流-追加模式 4 文件输出流-读取文本数据 高级流 1 流连接示意图 2 缓冲流 2.1 使用缓冲流完成文件复制操作 2 ...
最新文章
- 适合初学者的Python小游戏开发,不仅有趣还能巩固自己所学知识
- PyCharm中控制台输出日志分层级分颜色显示
- English trip V1 - 22. My Life Teacher:Emily Key: describe talk about past 过去式
- Angular router-outlet占位符层级结构的子节点,运行时是如何插入的
- JSR 303从I18N属性文件加载消息
- [css] 用css画一个五边形和一个六边形
- 5.Ray-Handler之ToReadHandler编写
- sql数据库快照与恢复 规则绑定
- Node:服务器端解决跨域
- HTML:常用代码(自用)
- android 图片自动移动位置信息,android – 使用翻译动画将ImageView从当前位置移动到固定位置...
- MIME 类型大全,你值得收藏
- 计算机删除程序后不能上网,把所有驱动程序全部卸载后电脑还能用吗?还能 – 手机爱问...
- 正确的做事和做正确的事
- pyautogui图形识别-confidence,grayscale
- bzoj2442[USACO2011 Open]Mowing the Lawn修建草坪
- 三位一撇:处理数字12345.67——12,345.67
- 给本本换硬盘,直接克隆旧盘!
- 计算机网络及应用【2】
- 如何发表一篇核心期刊论文