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相关推荐

  1. Unity中的序列化和反序列化

    一:前言 序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程.序列化最主要的用途就是传递对象和保存对象 在Unity中保存和加载.prefab.scene.Inspecto ...

  2. Unity对象和序列化原理介绍

    Unity使用了很多年了,在这里我敢说很多人对Unity对象和序列化原理并不是很清楚,比如Asset与Object之间有啥区别?如何管理Asset?Unity的序列化是咋回事等等,还有在项目中遇到资源 ...

  3. php serializable,PHP自定义序列化接口Serializable用法分析讲解

    这篇文章主要介绍了PHP自定义序列化接口Serializable用法,结合实例形式分析了Serializable自定义序列化接口的概念.功能.定义及使用方法,需要的朋友可以参考下 本文实例讲述了PHP ...

  4. Hadoop详解(三)——MapReduce原理和执行过程,远程Debug,Writable序列化接口,MapReduce程序编写

    MapReduce概述 MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. MR由两个阶段组成:Map和Reduce,用户只需要实现map()和Re ...

  5. Java篇 之 序列化与反序列化

    一.什么是序列化和反序列化 序列化:指把内存中的Java对象,通过某种方式存储到磁盘中或者传递给其他网络节点,通俗来说就是将对象转化为二进制串. 反序列化:把磁盘中的对象数据或者网络节点上的对象数据, ...

  6. Java序列化接口的作用总结1

    一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做"持久化". 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从 ...

  7. Java序列化接口Serializable接口的作用总结

    一.Java序列化接口Serializable的作用: 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做"持久化". 对象的默认序列化机制写入的内容是:对象的类,类签名, ...

  8. Mybatis逆向工程的pojo实现序列化接口代码

    情景如下,这两天在做一个分布式的项目,使用了Alibaba的dubbo作为通信工具,zookeeper作为register,由于dubbo是基于socket协议的,所以在进行pojo传输的时候报了异常 ...

  9. Java序列化接口的作用总结

    一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做"持久化". 把堆内存中的对象的生命周期延长,存入硬盘,做持久化操作.当下次再需要这个对象的时候,我们不用new了,直接从 ...

  10. 【java基础,IO合集】文件流、高级流(缓冲流、对象流)、 序列化接口java.io.Serrializable

    目录 文件流 1 块读写的文件复制操作 2 文件输出流-覆盖模式 3 文件输出流-追加模式 4 文件输出流-读取文本数据 高级流 1  流连接示意图 2 缓冲流 2.1 使用缓冲流完成文件复制操作 2 ...

最新文章

  1. 适合初学者的Python小游戏开发,不仅有趣还能巩固自己所学知识
  2. PyCharm中控制台输出日志分层级分颜色显示
  3. English trip V1 - 22. My Life Teacher:Emily Key: describe talk about past 过去式
  4. Angular router-outlet占位符层级结构的子节点,运行时是如何插入的
  5. JSR 303从I18N属性文件加载消息
  6. [css] 用css画一个五边形和一个六边形
  7. 5.Ray-Handler之ToReadHandler编写
  8. sql数据库快照与恢复 规则绑定
  9. Node:服务器端解决跨域
  10. HTML:常用代码(自用)
  11. android 图片自动移动位置信息,android – 使用翻译动画将ImageView从当前位置移动到固定位置...
  12. MIME 类型大全,你值得收藏
  13. 计算机删除程序后不能上网,把所有驱动程序全部卸载后电脑还能用吗?还能 – 手机爱问...
  14. 正确的做事和做正确的事
  15. pyautogui图形识别-confidence,grayscale
  16. bzoj2442[USACO2011 Open]Mowing the Lawn修建草坪
  17. 三位一撇:处理数字12345.67——12,345.67
  18. 给本本换硬盘,直接克隆旧盘!
  19. 计算机网络及应用【2】
  20. 如何发表一篇核心期刊论文

热门文章

  1. winrar 破解方法
  2. 从零开始学习股票知识
  3. RGB-D相机(Azure Kinect DK)RGB图、深度图的获取,配准与保存
  4. Mybatis Plus快速入门
  5. 深入理解Eureka自我保护机制
  6. 计算机音乐吧粉刷匠,奥尔夫小班音乐活动:《粉刷匠》
  7. 洛谷 P1359 租用游艇(Floyd, Dijkstra,SPFA)
  8. 使用labelme遇到path is on mount 'C:', start on mount 'D:'
  9. 台式计算机怎么装,台式机声卡如何安装
  10. 四月,诗月,你是最美人间四月天。