您现在的位置是:首页 >其他 >2023-05-27 Unity 2进制4——类对象的序列化与反序列化网站首页其他

2023-05-27 Unity 2进制4——类对象的序列化与反序列化

蔗理苦 2024-07-01 00:01:02
简介2023-05-27 Unity 2进制4——类对象的序列化与反序列化

一、序列化

(一)声明类对象

​ 如果要使用 C# 自带的序列化 2 进制方法,申明类时需要添加[System.Serializable]特性。

[System.Serializable]
public class Person
{
    public int age = 1;
    public string name = "xxx";
    public int[] ints = new int[] { 1, 2, 3, 4, 5 };
    public List<int> list = new List<int>() { 1, 2, 3, 4 };
    public Dictionary<int, string> dic = new Dictionary<int, string>() { { 1, "123" }, { 2, "1223" }, { 3, "435345" } };
    public StructTest st = new StructTest(2, "123");
    public ClassTest ct = new ClassTest();
}

[System.Serializable]
public struct StructTest
{
    public int i;
    public string s;

    public StructTest(int i, string s) {
        this.i = i;
        this.s = s;
    }
}

[System.Serializable]
public class ClassTest
{
    public int i = 1;
}

(二)方法一:使用内存流获得字节数组

​ 主要用于得到字节数组 可以用于网络传输。

  • 内存流对象

    类名:MemoryStream

    命名空间:System.IO

  • 进制格式化对象

    类名:BinaryFormatter

    命名空间:System.Runtime.Serialization.Formatters.Binary

  • 主要方法:序列化方法 Serialize

    将对象序列化为给定流。

    public void Serialize(Stream serializationStream, object obj);

Person p = new Person();

using (MemoryStream ms = new MemoryStream()) {
    // 2进制格式化程序
    BinaryFormatter bf = new BinaryFormatter();
    // 序列化对象 生成2进制字节数组 写入到内存流当中
    bf.Serialize(ms, p);
    // 得到对象的2进制字节数组
    byte[] bytes = ms.GetBuffer();
    // 存储字节
    File.WriteAllBytes(Application.dataPath + "/Lesson5.tang", bytes);
    // 关闭内存流
    ms.Close();
}

(三)方法二:使用文件流进行存储

​ 主要用于存储到文件中。

using (FileStream fs = new FileStream(Application.dataPath + "/Lesson5_2.tang", FileMode.OpenOrCreate,
           FileAccess.Write)) {
    // 2进制格式化程序
    BinaryFormatter bf = new BinaryFormatter();
    // 序列化对象 生成2进制字节数组 写入到内存流当中
    bf.Serialize(fs, p);
    fs.Flush();
    fs.Close();
}

​ C# 提供的类对象 2 进制序列化主要类是 BinaryFormatter
​ 通过其中的序列化方法即可进行序列化生成字节数组

二、反序列化

(一)反序列化文件数据

  • 主要方法:反序列化方法 Deserialize

    将指定的流反序列化为对象图

    public object Deserialize(Stream serializationStream);

using (FileStream fs = File.Open(Application.dataPath + "/Lesson5_2.tang", FileMode.Open, FileAccess.Read)) {
    // 申明一个 2进制格式化类
    BinaryFormatter bf = new BinaryFormatter();
    // 反序列化
    Person p = bf.Deserialize(fs) as Person;

    fs.Close();
}

(二)反序列化网络二进制数据

byte[] bytes = File.ReadAllBytes(Application.dataPath + "/Lesson5_2.tang");
// 申明内存流对象 一开始就把字节数组传输进去
using (MemoryStream ms = new MemoryStream(bytes)) {
    // 申明一个 2进制格式化类
    BinaryFormatter bf = new BinaryFormatter();
    // 反序列化
    Person p = bf.Deserialize(ms) as Person;

    ms.Close();
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。