序列化和反序列化 —— unity篇

Unity | 序列化(Serialized)和反序列化(NonSerialized)是什么意思 简单理解序列化(Serialized)和反序列化(NonSerialized)是什么意思? 阅读详情

一、什么是序列化和反序列化

  1. 序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程;.
  2. 序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。
  3. 反序列化:客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象
  4. 本质上讲,序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态。


二、为什么需要序列化与反序列化


        我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。
        那么当两个进程进行通信时,能否实现进程间的对象传送呢?答案是可以的!如何做到呢?这就需要序列化与反序列化了!
        换句话说,一方面,发送方需要把这个对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出对象。
        当我们明晰了为什么需要Java序列化和反序列化后,我们很自然地会想序列化的好处。其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。

三、序列化和反序列化的意义

  1. 永久性保存对象,保存对象的字节序列到本地文件或者数据库中;
  2. 通过序列化以字节流的形式使对象在网络中进行传递和接收;
  3. 通过序列化在进程间传递对象;

四、举例

// 需要导入命名空间
using System.IO;
using System.Xml.Serialization;
using UnityEditor;

// 先定义一个类:
public class Studnet{
    public string m_Name = "仑仑";
}

public class SerializeDemo : MonoBehaviour {


    void Start()
    {
        // 序列化:
        Student student = new Student();
        // 第一要确定储存的位置
        // Application.dataPath就是unity中的Asset文件夹 
        StreamWriter sw = new StreamWriter(Application.dataPath + "/Demo.xml");
        // 第二要对什么类型序列化
        XmlSerializer xs = new XmlSerializer(typeof(Student));
        // 第三对对象序列化
        xs.Serialize(sw, student);
        // 关闭流
        sw.Close();
        // 刷新Asset文件
        AssetDatabase.Refresh();
        // 运行程序会在Asset目录下看到Demo.xml文件


        // 反序列化
        // 第一确定对哪个文件进行反序列化
        StreamReader sr = new StreamReader(Application.dataPath + "/Demo.xml");
        // 第二要确定对什么类型反序列化
        XmlSerializer xs1 = new XmlSerializer(typeof(Student));
        // 第三反序列化
        Student student1 = xs1.Deserialize(sr) as Student;
        // 关闭流
        sr.Close();
        // 会在控制台看到 “仑仑”
        print(student1.m_Name);
    }
}

五、Unity中的序列化和反序列化

序列化规则

Unity 中的序列化程序在实时游戏环境中运行。这对性能有很大影响。因此,Unity 中的序列化与其他编程环境中的序列化行为不同。以下部分概述了如何在 Unity 中使用序列化。要使用字段序列化,您必须确保它:

  • 是 public,或具有 SerializeField 属性
  • 不是 static
  • 不是 const
  • 不是 readonly
  • 有一个fieldtype可以序列化的。

可以序列化的简单字段类型

  • Serializable 具有属性的自定义非抽象、非泛型类
  • Serializable 具有属性的自定义结构
  • 对派生自 UnityEngine.Object的对象的引用
  • 原始数据类型(int, float, double, bool, string, 等)
  • 枚举类型
  • 某些 Unity 内置类型:Vector2, Vector3, Vector4, Rect, Quaternion, Matrix4x4, Color, Color32, LayerMask, AnimationCurve, Gradient, RectOffset,GUIStyle

可序列化的容器字段类型

  • 可以序列化的简单字段类型的数组
  • 一个List<T>可以序列化的简单字段类型

注意:Unity 不支持多级类型(多维数组、交错数组和嵌套容器类型)的序列化。如果你想序列化这些,你有两个选择:将嵌套类型包装在一个类或结构中,或者使用序列化回调ISerializationCallbackReceiver 来执行自定义序列化。有关详细信息,请参阅有关 自定义序列化 的文档。

Unity实践

Unity序列化的关键字是 Serializable 和 SerializeField.

  • Serializable: 用于 自定义的,非 abstract 的类. 结构体等 , 使这类型也能序列化
  • SerializeField: 用于 非public 类型(如private),  使非public 类型也能序列化

====>

Dictionary容器序列化


在实践中,Dictionary容器也是经常使用的容器类。系统不支持Dictionary容器的序列化给我们造成了不便,我们也可以通过自定义序列化 / Odin 来解决 。

Odin 插件

Odin Inspector and Serializer | Improve your workflow in Unityhttps://odininspector.com

 配合 [ShowInInspector] 使用 

点击跳转 Odin下载

Unity-序列化和反序列化 序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象。 在Unity中保存和加载、prefab、scene、Inspector窗口、实例化预制体等都使用了序列化与反序列化。 阅读详情

相关推荐

CSV解析——简单利用反射+特性序列化CSV(一)

突然想结合Odin做一个解析CSV然后输出的工具,记录一下自己的想法,代码中的不足之处还希望大家指出 有关解析CSV的内容已经有很多了,这里我使用了Assets Store中的一个免费插件CSV Serialize,这里是插件的下载地址,这个插件比较简单,源码也是公开的,且只提供了反序列化CSV的函数。(有关csv这种格式的内容大家可以自行查找) 本文需要大家了解有关C#反射、特性、Linq方面...

工 具 人 1220

【Unity开发中什么是序列化与反序列化】

简单介绍一下Unity游戏开发中什么叫序列化与反序列化。

yebashi222的博客 426

【Unity&JSON】.net JSON 数组 序列化和反序列化,并 创建玩家数据列表

在Unity中序列化和反序列化Json和Json Array 原文的地址:http://stackoverflow.com/questions/36239705/serialize-and-deserialize-json-and-json-array-in-unity 本文仅作学习分享。 ---------------------------------------------

BuladeMian的博客,菜得抠脚,菜得真实 4741

【Unity】序列化与反序列化

本文将介绍Xml、二进制文件、Assets文件的序列化与反序列化操作。实际就是类对象与这三种文件之间的转换。

Davidorzs的博客 2160

【Unity JSON】JSON文件是什么?如何在Unity中通过JSON文件存储数据?

目录 JSON文件是什么? 如何在Unity中通过JSON文件存储数据? 序列化存储 反序列化读取 数据覆盖 JSON文件是什么? 谷歌一下JSON文件的定义(维基百科)。 JSON文件的内容非常简单,就是键值对、键值对......和键值对。 我们可以很直观地看到,JSON文件是将数据以关键字和数值配对的形式序列化,然后存储下来。 (写JSON文件时建议用英文,不然容易出现...

春雪阁 969

【Unity&JSON】JSON数据怎么才能读写多个数据,并创建数组

Console.WriteLine(json); 应该写为 System.Console.WriteLine(JSON); 参考资料2 里面有为什么 JSON 序列化 参考资料 1. 豆豆酱学C#笔记之Newtonsoft.Json(三) 2. Unity实现json格式的序列化并发布 3.

BuladeMian的博客,菜得抠脚,菜得真实 4739

C# 序列化与反序列化笔记

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; public class SerializableAndDeserialize : Editor { static string pa

qq_40143976的博客 159

Unity商业游戏底层加载框架一

本模块主要讲解: AssetBundle打包管理; 类对象池和资源对象池; 离线数据及配置表; 使用框架制作简单的UI; 预备知识了解 程序集(可以自行网上查找了解); unity资源加载方式(1,拖到组件上 2,Resources.load 3,AssetBundle 4,AssetDataBase.LoadAtPtah); c#的xml序列化 1,类转成xml 2,以及转成二进制; unity asset序列化; xml序列化与反序列化例子 //要序列...

weixin_43899724的博客 633

unity中Json序列化处理

Resources 在Asset下创建Resources文件夹,注文件夹名称不能打错,如果不用此方法也可以用io流完成Json的读取 Load Load(“path”)path表示Resources文件夹下路径,用于加载在Resources文件夹下物件和文字文件 UnloadUnusedAssets 用于卸载没有用的资源,减少内存压力,注像物件生成后如果马上进行UnloadUnusedAssets就会造成找不到物件贴图 LoadAll 用于加载文件夹内所有的物件 LoadAsync LoadAsync(“p

qq_45796212的博客 936

Unity中的序列化和反序列化

序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象在Unity中保存和加载、prefab、scene、Inspector窗口、实例化预制体等都使用了序列化与反序列化。...

L的博客 7946

LMS Virtual.Lab二次开发:声学仿真结果导出方法(VBScript、Python)

Siemens LMS Virtual.Lab 提供一套集成软件平台用以模拟机械系统的品质属性,如结构完整性、振动噪声、耐久性、系统动力学特性、驾驶的平顺性及操纵的稳定性等。

爱看书的小沐 6021

unity 常见问题

1. 'ParticleSystem.startSize' is obsolete: 改为: ParticleSystem m_System = GetComponent<ParticleSystem>(); ParticleSystem.MainModule main = m_System.main; main.startSizeMultiplier = 5; 2. unity 转 byte 数组方法: public sta...

youmangu的专栏 646

病理组学分析系列教程1:使用Python-histolab进行病理图像预处理,tiles切片自动生成

病理图像tiles自动生成,WSI图像预处理

qq_43449643的博客 1741

unity简单理解保存场景和载入场景

转载:https://blog.youkuaiyun.com/kmyhy/article/details/78643293 目录概念Player Prefs利用BinaryFormatter保存数据和json格式保存数据 概念 在 Unity 中关于保存,有 4 个关键的概念: PlayerPrefs: 这是一个特殊的缓存系统,在两次游戏过程中为玩家保存简单设定。许多新手程序员误以为他们能够用它来保存游戏存档,但这不是什么好的做法。它只允许你保存简单的东西,比如图形声音设置、登录信息或者其它基本的用户相关的数据。 序列

weixin_44453949的博客 2727

【24届计算机校招】面经汇总

这是笔者为了能够记录一下接下来一段时间会看的一些博客视频等汇总。一是为了汇总后常回来看看,而是为了后面的人在这个阶段准备的时候有个参考。现在已经6月底了,大部分高校的夏令营都出来了,而我至今还是夏0营,前几天还为川大会收双非而感到高兴,但遗憾的是川大并没要我。而我另一位双非的朋友已经拿到offer,在决定去南开还是华师了。没有对比就没伤害,我开始怀疑自己的决策是否正确——这段时间的夏令营我都有关注,但我仅报了少部分的几个酒吧舞,而没有选择海投,我觉得只要我认准了一个东西,我拼尽全力就一定能够获取到。

JehanRio's Private Blog 804

华为模拟器eNSP练习题 - HCIA综合实验

华为模拟器eNSP练习题 - HCIA综合实验 题目要求 ISP路由器只能配置IP地址,之后不得进行其他任何配置; 整个内部网络基于192.168.1.0/24进行地址规划; R1/R2之间启动OSPF协议,单区域; PC1-PC4自动获取IP地址; PC1不能telnet R1,PC1外的其他内网pc可以; PC1-PC4可以访问PC5,R2的公网接口只拥有一个公有IP12.0.0.1; 外部的client可以通过域名www.ensp.com访问http server; ISP路由telnet 12.0

炸鸡店老板z的博客 9870

Newtonsoft.Json 反序列化字典Key为Vector时解决方案

栗子: using Test = Dictionary<Vector2Int, Vector2>; public class NewBehaviourScript : MonoBehaviour { private void Awake() { Test list = new Test(); list.Add(Vector2Int.zero, Vector2Int.one); ...

小鱼游戏开发的博客 1238

单细胞测序中pseudo bulk差异分析的实战指南与审稿人应对策略

本文提供了单细胞测序中pseudo bulk差异分析的完整实战指南,旨在应对审稿人对样本量统计效力的质疑。文章详细解析了从数据聚合、使用DESeq2进行差异分析,到与单细胞水平结果进行交叉验证的全流程,并给出了应对常见问题与撰写回复的策略,帮助研究者提升结论的稳健性与说服力。

weixin_29214199的博客 820

unity 在安卓平台上读写

在安卓读写文件,在查阅多数资料时,发现具体指出的并没有多少,然后又是第一次尝试写博客,写的不好,可以多多交流。直接上代码;可以直接打包测试。使用的是Newtonsoft序列化与反序列化。 using Newtonsoft.Json; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using System; [Serializable]...

qq_44148565的博客 3790

星载SAR的各项指标解读(史上最全)

一、系统指标 系统指标主要指雷达系统的通用的指标,以及和卫星整星相关的指标,主要有一下几项: 工作频段: 雷达体制: 极化方式: 设计s

9272

ardupilot BMI088加速度陀螺仪学习

本节主要记录ardupilot 中BMI088传感器的学习过程,欢迎批评指正。BMI088是一款高性能6轴惯性传感器,由16位数字三轴±24g加速度计和16位数字三轴±2000°/ s陀螺仪组成。 BMI088允许高精度测量方向和沿三个正交轴的运动检测。BMI088具有高振动鲁棒性和3 x 4.5 x0.95mm³的小尺寸,是用于无人机和机器人应用等恶劣环境的高性能IMU中的独特产品。 BMI088专门设计用于有效抑制由于PCB上的共振或整个系统的结构而可能发生的振动。 除了高振动稳定性外,BMI088的出

陌城烟雨 2056

Unity自带JsonUtility最简单的Json文件读写方式

using UnityEngine; using System.IO; using System; [Serializable]//序列化 public class Player { public string name; public int age; public int level; } [Serializable]//序列化 public class Players { public Player[] players; } public class JsonMa

qq_42892451的博客 1036

C# 从数秒到毫秒:MySQL+Redis百万数据优化实战全解析

在处理百万级数据时,传统单体数据库常面临查询效率低下、数据库负载过高和用户体验差等问题。为解决这些性能瓶颈,可以采用MySQL分库分表、Redis缓存和异步统计的组合策略。 数据库分片:通过水平分表和分库实现,将单表数据分散到多个物理表或数据库实例中,降低单点负载。 Redis缓存:利用Redis缓存高频数据,减少数据库查询压力,提升响应速度。 异步统计:通过消息队列(如RabbitMQ)解耦统计任务,后台处理非实时任务,避免阻塞主流程。 这些优化策略能够显著提升系统性能,确保在高并发和大数据量场景下的稳定

墨夶的博客 852

unity -- 存档与读档

不同于unity自带的playerprefs的字典式存储,本文主要说明三种文件存储的具体实现方式(项目原型基于siki案例–存档与读档,类似于打砖块的小游戏),即:二进制方法、XML以及JSON。 三种存储方式的对比 一、二进制方式存储: 存储简单,但基本没有可读性。 二、XML: 可读性强,但文件庞大,冗余信息多。 三、JSON: 数据格式比较简单,易于读写,但是不直观,可读性比XML差。 三种方式存储的预先准备 首先得创建一个Save类存储相关数据并标记为可序列化,本例具体代码如下: (新建一个C#脚本

aidwao的博客 2757

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Unity C# 网络学习(一)

Unity C# 网络学习(一) 一.IP地址和端口类 public class Lesson01 : MonoBehaviour { private void Start() { var ipByte = new byte[]{128,123,116,21}; var ipAddress = new IPAddress(ipByte); //IP和端口 var ipEndPoint = new IPEndPoint(ipAdd

zzzsss123333的博客 1360

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

自定义Json数据管理类--支持JsonUtility和LitJson两种架包(提供泛型API,快速序列化或者反序列化自定义类型)

文件默认路径为:StreamingAssets文件夹以及persistentDataPath文件夹 两者的路径都可以通过API来获取 StreamingAssets文件夹(需要自己创建):Application.persistentDataPath PersistentDataPath文件夹(不需要自己创建):Application.persistentDataPath 如果使用LitJson进行序列化与反序列化则需要先导入LitJson架构包(默认使用 LitJson) using LitJson; us

qq_47904986的博客 429

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: 浅析游戏AI设计模式
下一篇: Flask+阿里云ECS+Nginx 搭建后台服务器 域名解析+响应简单http+转发访问https请求
IT外猩人
博客等级 码龄10年 3粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT外猩人

如果觉得有帮助,可以小小赞赏哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值