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