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


    [System.Serializable]标记类 序列化

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

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

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

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

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

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

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

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

    1. using System;
    2. using System.IO;
    3. using System.Runtime.Serialization.Formatters.Binary;
    4. // 定义一个自定义类,包含两个属性
    5. [Serializable]
    6. public class Person
    7. {
    8. public string Name { get; set; }
    9. public int Age { get; set; }
    10. }
    11. class Program
    12. {
    13. static void Main(string[] args)
    14. {
    15. // 创建一个Person对象
    16. Person person = new Person();
    17. person.Name = "小明";
    18. person.Age = 20;
    19. // 将对象序列化为字节数组
    20. BinaryFormatter formatter = new BinaryFormatter();
    21. MemoryStream stream = new MemoryStream();
    22. formatter.Serialize(stream, person);
    23. byte[] bytes = stream.ToArray();
    24. // 将字节数组反序列化为对象
    25. stream.Position = 0;
    26. Person clonePerson = (Person)formatter.Deserialize(stream);
    27. // 输出原始对象和克隆对象的属性
    28. Console.WriteLine("原始对象 Name={0}, Age={1}", person.Name, person.Age);
    29. Console.WriteLine("克隆对象 Name={0}, Age={1}", clonePerson.Name, clonePerson.Age);
    30. }
    31. }

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

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

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

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

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

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

  • 相关阅读:
    Mysql8.0~gh-ost~default_authentication_plugin导致ddl卡住
    为什么面试官狂问八股文?我已经被三家公司问到哑口无言……
    经典文献阅读之--lris(优于Scan Context的回环检测)
    GC调优思路
    pdf转换器哪个好用?这几款宝藏软件赶快用起来!
    使用ABP SignalR重构消息服务(一)
    Teamcenter_NX集成开发:使用NX、SOA连接Teamcenter
    一个年薪20万软件测试工程师都具备的能力,你有吗?
    oracle登录及基本操作
    记一次 Visual Studio 2022 卡死分析
  • 原文地址:https://blog.csdn.net/leoysq/article/details/133869736