当前位置: 首页 > news >正文

Unity中用序列化和反序列化来保存游戏进度

[System.Serializable]标记类 序列化

[System.Serializable]是一个C#语言中的属性,用于标记类,表示该类的实例可以被序列化和反序列化。序列化是指将对象转换为字节流的过程,以便可以将其保存到文件、数据库或通过网络传输。反序列化则是将字节流转换回对象的过程。

通过在类的定义前添加 [System.Serializable] 属性,可以告诉编译器该类可以被序列化。这样,在需要将该类的实例序列化或反序列化时,就可以使用相关的方法或工具来处理。

用一个通俗易懂的例子来解释。

假设你正在玩一个角色扮演游戏,游戏中有一个角色类,表示你所扮演的游戏人物。这个角色类包含了角色的姓名、等级、经验值等属性,还包含了一些方法来处理角色的行为,比如攻击、防御等。

现在你希望能够在游戏中保存你的角色,并且在下次进入游戏时能够恢复到上次离开游戏时的状态。这时,就需要将角色对象序列化。

假设游戏提供了一个保存功能,当你选择保存游戏时,系统会把你当前的角色对象序列化为字节流,并保存在文件中(比如一个存档文件)。这样,当你下次再打开游戏时,系统会读取该存档文件,并将字节流反序列化为角色对象,从而恢复出你之前保存的角色状态。

通过序列化和反序列化,你可以在游戏中实现数据的持久化,随时保存和加载角色对象,而不会丢失之前的游戏进度。

这只是一个简单的例子,类的序列化在实际应用中还有更多的用途,比如在分布式系统中传输对象、在网络通信中传输数据等。通过序列化,我们可以方便地将对象转换为字节流进行传输和存储,实现数据的持久化和跨系统的通信。

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;// 定义一个自定义类,包含两个属性
[Serializable]
public class Person
{public string Name { get; set; }public int Age { get; set; }
}class Program
{static void Main(string[] args){// 创建一个Person对象Person person = new Person();person.Name = "小明";person.Age = 20;// 将对象序列化为字节数组BinaryFormatter formatter = new BinaryFormatter();MemoryStream stream = new MemoryStream();formatter.Serialize(stream, person);byte[] bytes = stream.ToArray();// 将字节数组反序列化为对象stream.Position = 0;Person clonePerson = (Person)formatter.Deserialize(stream);// 输出原始对象和克隆对象的属性Console.WriteLine("原始对象 Name={0}, Age={1}", person.Name, person.Age);Console.WriteLine("克隆对象 Name={0}, Age={1}", clonePerson.Name, clonePerson.Age);}
}

该示例中,我们定义了一个名为 Person 的自定义类,并为其添加了 [Serializable] 属性,以告诉编译器该类可以被序列化。

在 Main 方法中,我们首先创建了一个 Person 对象,并设置其 Name 和 Age 属性。然后,我们使用 BinaryFormatter 对象将该对象序列化为一个字节数组,并将其保存在 MemoryStream 中。

接着,我们使用 BinaryFormatter 对象将 MemoryStream 中的字节数组反序列化为一个新的 Person 对象,并将其存储在 clonePerson 变量中。

最后,我们输出了原始对象和克隆对象的属性,以确认序列化和反序列化是否成功。如果一切顺利,该示例应该输出如下文本:

原始对象 Name=小明, Age=20
克隆对象 Name=小明, Age=20
 

 上就是一个简单的C#代码示例,演示了如何将自定义类进行序列化和反序列化。需要注意的是,序列化和反序列化操作会将对象转换为字节流,因此需要确保类中包含的属性都可以被序列化。通常情况下,基本数据类型和字符串都可以被序列化,如果类中包含其他对象,则需要确保这些对象也可以被序列化。

http://www.lryc.cn/news/195271.html

相关文章:

  • Junit 单元测试之错误和异常处理
  • LockSupport-park和unpark编码实战
  • js深拷贝与浅拷贝
  • Docker-harbor私有仓库部署与管理
  • ArcGIS笔记8_测量得到的距离单位不是米?一经度一纬度换算为多少米?
  • SpringBoot入门详解
  • 数据分析案例-基于snownlp模型的MatePad11产品用户评论情感分析(文末送书)
  • Leetcode刷题解析——904. 水果成篮
  • Spring Boot RESTful API
  • k8s day04
  • ESP32-IPS彩屏ST7789-Arduino-简单驱动
  • 高效工具类软件使用
  • 批处理文件(.bat)中,dir与tree命令的效果
  • STM32 ---- 再次学习STM32F103C8T6/STM32F409IGT6
  • UE4 EQS环境查询 学习笔记
  • 计算机算法分析与设计(11)---贪心算法(活动安排问题和背包问题)
  • shell命令以及运行原理
  • MySQL进阶(再论JDBC)——JDBC编程思想的分析 JDBC的规范架构 JDBC相关的类分析
  • rabbitMQ的知识点
  • ​EtherNet/IP 库卡机器人和EtherCAT倍福PLC总线协议连接案例​
  • 微信小程序 uniapp+vue线上洗衣店业务管理系统演89iu2
  • Maven项目,进行编译,使用idea的 编译功能,就是正常的,但是在终端中执行 mvn clean compile 报错
  • mssql还原数据库失败
  • Linux多线程编程- 无名信号量
  • 【网络协议】聊聊DHCP和PXE 工作原理
  • 发现国内优秀的团队协作软件,帮助提高工作效率
  • LeetCode 面试题 08.12. 八皇后
  • Excel 的下拉列表
  • 基于Effect的组件设计 | 京东云技术团队
  • 541. 反转字符串 II