Unity 数据持久化

server/2025/2/28 2:54:44/

概述

数据序列化和持久化

序列化:将对象或者数据结构转化成特定的格式,使其可在网络中传输,或者可存储在内存或者文件中。

持久化:将数据存储到可永久保存的存储介质中(如磁盘)。

序列化和反序列化

序列化:将类对象信息转换为可保存或传输的格式的过程。

反序列化:与序列化相对,将保存或传输过来的格式转换为类对象的过程。

为什么需要关注序列化?

  1.  数据持久化:保存玩家存档、配置数据、场景状态。

  2. Inspector交互:在编辑器中直观调整脚本参数。

  3. 跨平台兼容:通过标准格式(如JSON)实现不同平台间的数据交换。

  4. 性能优化:合理的序列化策略可减少内存占用和加载时间。 

PlayerPrefs

常用接口

SetInt

保存整型数据

GetInt

读取整型数据

SetFloat

保存浮点型数据

GetFloat

读取浮点型数据

SetString

保存字符串数据

GetString

读取字符串数据

DeleteAll

删除所有保存的数据(谨慎使用)

DeleteKey

删除指定键的数据

HasKey

判断本地是否有保存指定键对应的数据

Save

保存所有修改的数据

优缺点

优点

简单易用

缺点

1、只能支持三种类型的数据存取:int\float\string

2、数据安全型低

适用范围

适合用来存储暂时性数据:

1、玩家偏好设定

2、简单的数据

3、游戏原型制作时临时存储方案

Json

常用接口

JsonUtility

JsonUtility是Unity内置的JSON处理工具,不支持Dictionary、Query、Stack等集合。

1、object转json字符串

var str = JsonUtility.ToJson(obj);

 2、object转json字符串,格式化打印,看起来更直观

var str = JsonUtility.ToJson(obj);

3、json字符串转指定类型

Student result = JsonUtility.FromJson<Student>(str);

LitJSON

需要将LitJSON.dll文件放入到Plugins文件夹下,支持Dictionary

// 将数据对象转为字符串
var str = LitJson.JsonMapper.ToJson(obj);
//json字符串转为对象
Student result = LitJson.JsonMapper.ToObject<Student>(str);

提示

1、有些数据JsonUtility可以序列化而LitJSON不可以;有些数据LitJSON可以而JsonUtility不可以,所以联合使用可达奇效。

2、将获取的json字符串写入到一个文件中,并保存到Application.persistentDataPath指定的自定义文件夹下。读取的时候从该路径下就可以读取保存的数据,从而实现数据持久化。

优缺点

优点

1、方便人类阅读和编写

2、使用范围广泛,支持多种主流编程语言

3、轻量级,易于网络传输、解析和生成

缺点

1、数据安全型低

2、文件读写时效率较低

3、内存和硬盘占用空间大

适用范围

1、网络数据交换

2、存储不是很重要并且需要大量读取和修改的数据

3、玩家偏好设置

二进制

通过将各类型变量转换为字节数组,再将字节数组直接存储到文件中。

常用接口

处理非字符串数据

支持整型、浮点型、字符型、布尔型

int value = 365;
//数据转成字节数组
var array = BitConverter.GetBytes(value);
//将字节数据转成指定数据
var result = BitConverter.ToInt32(array);

处理字符串数据

var str = "好好学习,天天向上";
//字符串转byte数组
Byte[] array = Encoding.UTF8.GetBytes(str);
//byte数组转字符串
string result = Encoding.UTF8.GetString(array);

处理类对象

注意:如果要使用C#自带的序列化二进制方法,申明类时需要添加[System.Serializable]特性。如果没有这个特性,BinaryFormatter 将无法处理该类

[Serializable]
public class Student
{public int id;public string name;public List<int> dataList;public Dictionary<string, int> scoreDic;
}

第一种方法

/****************************序列化(二进制文件)****************************/
using (MemoryStream ms = new MemoryStream())
{//二进制格式化程序BinaryFormatter bf = new BinaryFormatter();//序列化对象 生成二进制字节数组 写入到内存流当中bf.Serialize(ms, obj);//得到对象的二进制字节数组byte[] bytes = ms.GetBuffer();//存储字节File.WriteAllBytes(Application.dataPath + "/Test.bytes", bytes);
}/****************************反序列化(二进制文件)****************************/
//目前没有网络传输 我们还是直接从文件中获取
byte[] bytes = File.ReadAllBytes(Application.dataPath + "/Test.bytes");
//申明内存流对象 一开始就把字节数组传输进去
using (MemoryStream ms = new MemoryStream(bytes))
{//申明一个 2进制格式化程序BinaryFormatter bf = new BinaryFormatter();//反序列化var result = bf.Deserialize(ms) as Student;
}

第二种方法

var filePath = Application.dataPath + "/Student.bytes";
/****************************序列化(二进制文件)****************************/
using (FileStream fs = File.OpenWrite(filePath)){//申明一个二进制格式化类BinaryFormatter bf = new BinaryFormatter();//序列化对象 生成2进制字节数组 写入到内存流当中bf.Serialize(fs, obj);
}/****************************反序列化(二进制文件)****************************/
//通过文件夹流打开指定的2进制数据文件
using (FileStream fs = File.OpenRead(filePath)){//申明一个二进制格式化类BinaryFormatter bf = new BinaryFormatter();//反序列化Student result = bf.Deserialize(fs) as Student;
}

优缺点

优点

(相比于json和xml方案)

1、安全性较高

2、文件读写时效率较高

3、内存和硬盘占用空间小

缺点

1、可读性低,不易于人类阅读

适用范围

广泛应用于网络通信

XML(不推荐)

不支持序列化字典

//XML序列化
void SerializeToXML<T>(T data, string path) {XmlSerializer serializer = new XmlSerializer(typeof(T));using (StreamWriter stream = new StreamWriter(path)) {serializer.Serialize(stream, data);}
}//XML反序列化
T DeserializeFromXML<T>(string path) {XmlSerializer serializer = new XmlSerializer(typeof(T));using (StreamReader stream = new StreamReader(path)) {return (T)serializer.Deserialize(stream);}
}

http://www.ppmy.cn/server/171192.html

相关文章

AI数字人开发,引领科技新潮流

引言 随着人工智能技术的迅猛发展&#xff0c;AI 数字人在影视娱乐、客户服务、教育及医疗等多个领域展现出巨大的潜力。本文旨在为开发者提供一份详细的 AI 数字人系统开发指南&#xff0c;涵盖从基础架构到实现细节的各个方面&#xff0c;包括人物建模、动作生成、语音交互、…

【2025信息安全软考重点考点归纳】实时更新

重点页:第14章 恶意代码防范技术原理 页码&#xff1a;271 病毒载体及其对应案例 病毒隐秘载体病毒案例Word文档Melissa照片库尔尼科娃电子邮件“求职信”病毒网页NIMDA病毒 重点页&#xff1a;第6章 认证技术原理与应用 页码&#xff1a;125 Kerberos 认证技术 Kerberos是…

三甲医院网络架构与安全建设实战

一、设计目标 实现医疗业务网/卫生专网/互联网三网隔离 满足等保2.0三级合规要求 保障PACS影像系统低时延传输 实现医疗物联网统一接入管控 二、全网拓扑架构 三、网络分区与安全设计 IP/VLAN规划表 核心业务配置&#xff08;华为CE6865&#xff09; interface 100G…

STM32 最小系统

STM32 最小系统 最小系统就是保证 MCU 正常运行的最低要求&#xff0c;一般是指 MCU 的供电、复位、晶振、BOOT 等部分。 最小系统需求如表&#xff1a;F407/F103最小系统都是一样的

基于Python异常信息丰富度约束下CNN压缩系统设计与实现

项目地址&#xff1a;基于Python异常信息丰富度约束下CNN压缩系统设计与实现 摘 要 结构化网络剪枝的过程主要包括两种:逐层迭代剪枝和端到端迭代剪枝。而其中端到端迭代方案在获取第一个剪枝网络结构时&#xff0c;网络各层过滤器被剪枝的个数是随机的&#xff0c;破坏了原始…

江协科技/江科大-51单片机入门教程——P[1-3] 单片机及开发板介绍

前言&#xff1a;本节主要的任务是了解一下 51 单片机和所用的普中51开发板。 目录 一、单片机介绍 二、单片机的应用领域 三、STC89C52单片机 四、命名规则 五、单片机内部拆解 六、单片机内部结构图 七、单片机管脚图 八、单片机最小系统 九、开发板介绍 十、开发…

人工智能丨大语言模型不再高不可攀!DeepSeek开源FlashMLA,开启AI新纪元

在人工智能技术飞速发展的今天&#xff0c;DeepSeek宣布开源其核心大语言模型框架——FlashMLA&#xff0c;这一举动引发了业界的广泛关注。那么&#xff0c;DeepSeek开源FlashMLA&#xff0c;究竟意味着什么&#xff1f;这不仅是一次技术上的开放&#xff0c;更是对行业生态、…

刚充值Deepseek账号,但接入官方的API却遇到了问题【VSCode Cline Cursor Deepseek deepseek-reasoner】

本文解决以下疑难杂症: 使用deepseek的最新接模型接入ide 使用deepseek的最新接模型接入vscode 使用deepseek的最新接模型接入vscode中的Cline 使用deepseek的最新接模型接入Cline 使用cursor接入Deepseek官方的的deepseek-reasoner模型api&#xff0c;而不是使用cursor p…