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

news2025/1/10 20:59:33

[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.coloradmin.cn/o/1100252.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Davinci NvM Block配置

存储块的配置方法 在下图中的位置添加Block的时候,Davinci会在NVM模块和Fee模块同时添加Block,并进行关联。且Fee Block的数量由NvM Block的类型决定,当NvM Block是Native时,会生成一个Fee Block;当NvM Block是Redund…

ant design vue:自定义锚点样式

要做一个如下图的锚点,ant design vue的锚点样式比较简单,按照官网文档:affix"false" :showInkInFixed"true",就可以显示小方块,但是我试了一下不管用,而且锚点组件不固定起来很不方便&#xff0c…

[大三上20231016]JavaEE SpringBoot

[大三上20231016]JavaEE SpringBoot 学习是个积累,踏踏实实去做,多去虚心请教,热爱兴趣很重要 课前提问: Spring框架中的核心组件是什么? IOC,AOP IOC: Inversion of Control即控制反转 AOP: Aspect Oriented Programming 面向切面编程 什么是IOS什么是DI? IOS(作用:…

《向量数据库指南》——选择向量数据库时需要考量的点Milvus Cloud

大禹智库:选择向量数据库时需要考量的点 性能 如上述,查询性能(查询的响应时间,系统的吞吐能力)是在选型向量数据库时的一个重要参考点,市面上现有的向量数据库的 Benchmark 有: ANN-Benchmark 是一种用于评估各种向量数据库和近似最近邻(ANN)算法性能的工具 VectorD…

如何快速集成讯飞星火 2.0 API ?

大家好,我是二哥呀。 之前带大家体验了两波科大讯飞的星火认知大模型,真没想到,反馈远超我的预期,大家普遍都说好,不仅注册方便,工作和学习的效率也得到了极大的提升。 今天继续给大家带来重磅体验&#…

SLAM从入门到精通(a*搜路算法)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 目前机器人常用的搜路算法主要有这么几种,迪杰斯特拉算法、a*算法、贪心算法。每一种算法都有自己的场景和优势,可以灵活选…

如何在Linux环境中远程访问企业级夜莺监控分析工具?

文章目录 前言1. Linux 部署Nightingale2. 本地访问测试3. Linux 安装cpolar4. 配置Nightingale公网访问地址5. 公网远程访问Nightingale管理界面6. 固定Nightingale公网地址 前言 夜莺监控是一款开源云原生观测分析工具,采用 All-in-One 的设计理念,集…

微信小程序2

一,视图层 1.什么视图层 框架的视图层由 WXML 与 WXSS 编写,由组件来进行展示。 将逻辑层的数据反映成视图,同时将视图层的事件发送给逻辑层。 WXML(WeiXin Markup language) 用于描述页面的结构。 WXS(WeiXin Script) 是小程序的一套脚本语…

深入理解强化学习——强化学习智能体的四要素:策略(Policy)

分类目录:《深入理解强化学习》总目录 相关文章: 强化学习智能体的四要素:策略(Policy) 强化学习智能体的四要素:收益信号(Revenue Signal) 强化学习智能体的四要素:价…

备忘录模式-撤销功能的实现

在idea写代码的过程中,会经常用到一个快捷键——“crtl z”,即撤销功能。“备忘录模式”则为撤销功能提供了一个设计方案。 1 备忘录模式 备忘录模式提供一种状态恢复机制。在不破坏封装的前提下,捕获对象内部状态并在该对象之外保存这个状态。可以在…

关于职业规划的学习经验总结

目录 前言 结构化思考 思考快与慢 积极主动 以终为始 要事第一 前言 每一年的年中或者年终都有一场很重要的活动就是述职,需要花费一定精力投入,那么述职是一种形式吗?当然不是。述职是一种组织的管理手段和机制,通过这种机制除了对战略方向和项目进度进行把控,还对…

chatgpt 4V 识图功能

1.获取图片的sig和file_id 2e0edc6e489ed13a3f32f0dd87527d77.jpg是本地图片的名字 头部认证信息自己F12 抓取 1.获取图片的sighttps://chat.openai.com/backend-api/filesAuthorization:Bearer eyJhbGc****************5V-lztYwLb9hr6LP7g Cookie: **********************…

set_data_check做等长线

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 常常会遇见2out的多个信号需要做等长,下面分享一个脚本。 set port1_coll [get_ports out[*]] set port2_coll [get_ports out[*]] foreach_in_collection temp1 $…

ChatGPT教你5分钟解锁国际象棋技能

国际象棋是一种很好玩的棋类游戏,走法和规则与中国象棋有所区别。如果想要快速入门,可以把ChatGPT当做私人教练,提出这些问题: ●作为零基础的初学者,学习国际象棋的最佳方法是什么?如何快速入门&#xff…

计算机保研推免面试复习大纲(数学+408)

目录 线性代数概率论高等数学信号与系统离散数学操作系统计算机网络计算机组成数据结构算法编译原理C杂项 线性代数 怎么求逆矩阵 逆矩阵: A A − 1 E AA^{-1}E AA−1E,伴随矩阵: A A ∗ A ∗ A ∣ A ∣ E AA^{*}A^{*}A|A|E AA∗A∗A∣A∣…

算法通关村第一关-链表白银经典问题笔记

大家好今天来写第一关的白银挑战-链表经典问题. 两个链表的第一个公共结点 这是一道经典的链表问题 : 输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。 牛客NC66 : 剑指offer56 : 分析 : 屡试不爽的方法: 将常用数据…

第15章 SpringBoot

所有的流程逻辑原理都是针对2.3.2.RELEASE版本 15.1 谈谈你对微服务架构演进的理解 难度:★ 重点:★ 白话解析 还是串主线,在串主线的过程中发现问题,解决问题。主线的入口:随着业务的逻辑越来越复杂,架构再不断升级演进,先理解架构的演进。 这道题参考了:企业IT架构转…

引领虚拟化技术新潮流:VMware Fusion Pro for Mac/win中文版

当谈论虚拟机时,很多人可能会对其有所了解,但并不一定清楚它的具体作用和优势。在这篇文章中,我们将带您走进虚拟机的世界,并深入了解VMware Fusion Pro这一专业虚拟化解决方案的独特魅力。 虚拟机是一种模拟真实计算机环境的软件…

黑马mysql教程笔记(mysql8教程)基础篇——函数(字符串函数、数值函数、日期函数、流程函数)

参考文章1:https://www.bilibili.com/video/BV1Kr4y1i7ru/ 参考文章2:https://dhc.pythonanywhere.com/article/public/1/ 文章目录 基础篇函数字符串函数常用函数使用示例实例:更新已有的所有员工号,使其满足5位数长度&#xff…