10.二进制数据管理器

  1. 10.CSharp类对象相关-综合练习题
    1. 10.1 知识点
      1. 请实现一个管理类,用于快捷读写自定义类对象数据
        1. 定义二进制数据管理类,做成单例,定义数据存储路径
        2. 创建二进制保存类对象函数。检查指定的路径文件夹是否存在,如果不存在则创建该文件夹。使用 FileStream 创建一个文件流,指定要打开或创建的文件的方式为打开或创建。创建 BinaryFormatter 对象,用于序列化数据。调用 BinaryFormatter 对象的 Serialize 方法,将要保存的对象 obj 序列化到文件流中,以保存对象的数据。关闭文件流,确保数据已经保存到文件中。
        3. 创建二进制读取类对象函数。检查指定的二进制数据文件是否存在,如果文件不存在,则直接返回指定类型对象的默认值。创建一个泛型对象 obj,用于存储反序列化后的对象数据。使用 FileStream 打开文件流,指定要打开的文件的路径、打开方式为只读。创建 BinaryFormatter 对象,用于反序列化数据。调用 BinaryFormatter 对象的 Deserialize 方法,将文件流中的数据反序列化为指定类型的对象,并将其赋值给 obj。关闭文件流,确保资源释放。返回读取到的对象 obj。
        4. 创建测试类进行测试,注意添加可序列化特性
    2. 10.2 知识点代码
      1. BinaryDataMgr
      2. Lesson10_CSharp类对象相关_综合练习题

10.CSharp类对象相关-综合练习题


10.1 知识点

请实现一个管理类,用于快捷读写自定义类对象数据

定义二进制数据管理类,做成单例,定义数据存储路径

/// <summary>
/// 二进制数据管理器
/// </summary>
public class BinaryDataMgr
{
    private static BinaryDataMgr instance = new BinaryDataMgr();
    public static BinaryDataMgr Instance => instance;

    private BinaryDataMgr()
    {

    }

    /// <summary>
    /// 数据存储路径
    /// </summary>
    private static string SAVE_PATH = Application.persistentDataPath + "/Data/";
}

创建二进制保存类对象函数。检查指定的路径文件夹是否存在,如果不存在则创建该文件夹。使用 FileStream 创建一个文件流,指定要打开或创建的文件的方式为打开或创建。创建 BinaryFormatter 对象,用于序列化数据。调用 BinaryFormatter 对象的 Serialize 方法,将要保存的对象 obj 序列化到文件流中,以保存对象的数据。关闭文件流,确保数据已经保存到文件中。

/// <summary>
/// 存储类对象数据
/// </summary>
/// <param name="obj">要保存的对象</param>
/// <param name="fileName">文件名</param>
public void Save(object obj, string fileName)
{
    // 先判断路径文件夹是否存在,如果不存在则创建
    if (!Directory.Exists(SAVE_PATH))
        Directory.CreateDirectory(SAVE_PATH);

    // 使用 FileStream 创建一个文件流,并指定打开或创建文件的方式
    using (FileStream fs = new FileStream(SAVE_PATH + fileName + ".tao", FileMode.OpenOrCreate, FileAccess.Write))
    {
        // 创建 BinaryFormatter 对象用于序列化数据
        BinaryFormatter bf = new BinaryFormatter();

        // 将对象 obj 序列化到文件流中
        bf.Serialize(fs, obj);

        // 关闭文件流
        fs.Close();
    }
}

创建二进制读取类对象函数。检查指定的二进制数据文件是否存在,如果文件不存在,则直接返回指定类型对象的默认值。创建一个泛型对象 obj,用于存储反序列化后的对象数据。使用 FileStream 打开文件流,指定要打开的文件的路径、打开方式为只读。创建 BinaryFormatter 对象,用于反序列化数据。调用 BinaryFormatter 对象的 Deserialize 方法,将文件流中的数据反序列化为指定类型的对象,并将其赋值给 obj。关闭文件流,确保资源释放。返回读取到的对象 obj。

/// <summary>
/// 从二进制数据文件中读取并转换为指定类型的对象
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="fileName">文件名</param>
/// <returns>读取到的对象</returns>
public T Load<T>(string fileName) where T : class
{
    // 如果文件不存在,则直接返回指定类型对象的默认值
    if (!File.Exists(SAVE_PATH + fileName + ".tao"))
        return default(T);

    T obj;
    // 使用 FileStream 打开文件流,并指定打开文件的方式为只读
    using (FileStream fs = File.Open(SAVE_PATH + fileName + ".tao", FileMode.Open, FileAccess.Read))
    {
        // 创建 BinaryFormatter 对象用于反序列化数据
        BinaryFormatter bf = new BinaryFormatter();

        // 将文件流中的数据反序列化为指定类型的对象
        obj = bf.Deserialize(fs) as T;

        // 关闭文件流
        fs.Close();
    }

    return obj;
}

创建测试类进行测试,注意添加可序列化特性

public class Lesson10_CSharp类对象相关_综合练习题 : MonoBehaviour
{
    //练习题 请实现一个管理类,用于快捷读写自定义类对象数据
    void Start()
    {
        //Test t1 = new Test();
        //t1.i = 250;
        //t1.str = "林文韬欢迎你";
        
        //print(Application.persistentDataPath);
        //BinaryDataMgr.Instance.Save(t1, "林文韬哈哈哈");
        
        Test t2 = BinaryDataMgr.Instance.Load<Test>("林文韬哈哈哈");
    }
}

[System.Serializable]
public class Test
{
    public int i;
    public string str;
}

10.2 知识点代码

BinaryDataMgr

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;

/// <summary>
/// 二进制数据管理器
/// </summary>
public class BinaryDataMgr
{
    private static BinaryDataMgr instance = new BinaryDataMgr();
    public static BinaryDataMgr Instance => instance;

    private BinaryDataMgr()
    {
    }

    /// <summary>
    /// 数据存储路径
    /// </summary>
    private static string SAVE_PATH = Application.persistentDataPath + "/Data/";

    /// <summary>
    /// 存储类对象数据
    /// </summary>
    /// <param name="obj">要保存的对象</param>
    /// <param name="fileName">文件名</param>
    public void Save(object obj, string fileName)
    {
        // 先判断路径文件夹是否存在,如果不存在则创建
        if (!Directory.Exists(SAVE_PATH))
            Directory.CreateDirectory(SAVE_PATH);

        // 使用 FileStream 创建一个文件流,并指定打开或创建文件的方式
        using (FileStream fs = new FileStream(SAVE_PATH + fileName + ".tao", FileMode.OpenOrCreate, FileAccess.Write))
        {
            // 创建 BinaryFormatter 对象用于序列化数据
            BinaryFormatter bf = new BinaryFormatter();

            // 将对象 obj 序列化到文件流中
            bf.Serialize(fs, obj);

            // 关闭文件流
            fs.Close();
        }
    }

    /// <summary>
    /// 从二进制数据文件中读取并转换为指定类型的对象
    /// </summary>
    /// <typeparam name="T">对象类型</typeparam>
    /// <param name="fileName">文件名</param>
    /// <returns>读取到的对象</returns>
    public T Load<T>(string fileName) where T : class
    {
        // 如果文件不存在,则直接返回指定类型对象的默认值
        if (!File.Exists(SAVE_PATH + fileName + ".tao"))
            return default(T);

        T obj;
        // 使用 FileStream 打开文件流,并指定打开文件的方式为只读
        using (FileStream fs = File.Open(SAVE_PATH + fileName + ".tao", FileMode.Open, FileAccess.Read))
        {
            // 创建 BinaryFormatter 对象用于反序列化数据
            BinaryFormatter bf = new BinaryFormatter();

            // 将文件流中的数据反序列化为指定类型的对象
            obj = bf.Deserialize(fs) as T;

            // 关闭文件流
            fs.Close();
        }

        return obj;
    }
}

Lesson10_CSharp类对象相关_综合练习题

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson10_CSharp类对象相关_综合练习题 : MonoBehaviour
{
    //练习题 请实现一个管理类,用于快捷读写自定义类对象数据
    void Start()
    {
        //Test t1 = new Test();
        //t1.i = 250;
        //t1.str = "林文韬欢迎你";

        //print(Application.persistentDataPath);
        //BinaryDataMgr.Instance.Save(t1, "林文韬哈哈哈");

        Test t2 = BinaryDataMgr.Instance.Load<Test>("林文韬哈哈哈");
    }
}

[System.Serializable]
public class Test
{
    public int i;
    public string str;
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏