11.总结
11.1 知识点
总结主要内容
学习内容回顾
优点
缺点
主要用处
11.2 核心要点速览
数据类型 ↔ 字节数组转换
操作 | 类/方法 | 代码示例 | 说明 |
---|---|---|---|
数值转字节 | BitConverter.GetBytes() | byte[] bytes = BitConverter.GetBytes(999); | 支持 int/float/bool 等,默认小端序(低位在前) |
字节转数值 | BitConverter.ToXX() | int i = BitConverter.ToInt32(bytes, 0); | 需指定起始索引,确保字节长度匹配(如 int 需 4 字节) |
字符串转字节(UTF-8) | Encoding.UTF8.GetBytes() | byte[] strBytes = Encoding.UTF8.GetBytes(“林文韬”); | 中文需用 UTF-8,避免乱码 |
字节转字符串(UTF-8) | Encoding.UTF8.GetString() | string str = Encoding.UTF8.GetString(strBytes); | 支持指定范围:GetString(bytes, startIndex, length) |
注意事项 | - 小端序(低位在前) - 字符串需先存长度(如 int 表示字节数) |
网络传输常用大端序,需手动反转字节顺序 |
文件操作(File 类)
操作 | 方法 | 代码示例 | 说明 |
---|---|---|---|
创建文件 | File.Create(path) | FileStream fs = File.Create(Application.persistentDataPath + “/data.bin”); | 创建空文件,路径需含文件名 |
写入字节 | File.WriteAllBytes() | File.WriteAllBytes(path, bytes); | 覆盖写入,适合小文件 |
写入文本 | File.WriteAllText() | File.WriteAllText(path, “文本内容”, Encoding.UTF8); | 自动处理编码,默认 UTF-8 |
读取字节 | File.ReadAllBytes() | byte[] data = File.ReadAllBytes(path); | 一次性读取,适合小文件 |
判断存在 | File.Exists(path) | if (File.Exists(path)) { … } | 避免操作不存在的文件 |
删除文件 | File.Delete(path) | File.Delete(path); | 不可恢复,谨慎操作 |
复制文件 | File.Copy(src, dest, true) | File.Copy(oldPath, newPath, true); | 第三个参数 true 覆盖已存在文件 |
适用场景 | 简单文件读写(非流式) | 适合配置文件、小数据存储 |
文件流操作(FileStream 类)
操作 | 方法 | 代码示例 | 说明 |
---|---|---|---|
打开/创建流 | new FileStream(…) | using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite)) {} | FileMode.OpenOrCreate 常用,using 自动释放资源 |
写入字节 | fs.Write(bytes, 0, len) | fs.Write(BitConverter.GetBytes(strBytes.Length), 0, 4); // 先写字符串长度 fs.Write(strBytes, 0, strBytes.Length); // 再写字符串 |
按顺序写入,需自定义协议(如先长度后内容) |
读取字节 | fs.Read(buffer, 0, len) | byte[] buffer = new byte[4]; fs.Read(buffer, 0, 4); // 读 int:int len = BitConverter.ToInt32(buffer, 0); buffer = new byte[len]; fs.Read(buffer, 0, len); // 读字符串 |
严格按写入顺序读取,避免索引错位 |
刷新缓冲区 | fs.Flush() | fs.Flush(); // 强制写入磁盘 | 防止数据丢失(如程序崩溃前) |
关闭流 | fs.Close() / using | fs.Close(); // 或用 using 块 | 未关闭可能导致文件被占用,无法删除 |
适用场景 | 流式读写(大文件/复杂结构) | 适合玩家存档、二进制日志 |
文件夹操作(Directory 类)
操作 | 方法 | 代码示例 | 说明 |
---|---|---|---|
创建文件夹 | Directory.CreateDirectory(path) | Directory.CreateDirectory(Application.persistentDataPath + “/logs”); | 递归创建多级目录(如 /a/b/c) |
删除文件夹 | Directory.Delete(path, true) | Directory.Delete(folderPath, true); // 强制删除非空目录 | 第二个参数 true 递归删除子文件/夹 |
判断存在 | Directory.Exists(path) | if (Directory.Exists(folderPath)) { … } | 检查目录是否存在 |
获取子文件 | Directory.GetFiles(folder) | string[] files = Directory.GetFiles(folder, “*.bin”, SearchOption.AllDirectories); | 支持通配符(如 *.bin),SearchOption 控制是否搜索子目录 |
移动文件夹 | Directory.Move(oldPath, newPath) | Directory.Move(“旧路径”, “新路径”); | 目标路径不可存在同名目录 |
目录信息 | DirectoryInfo | DirectoryInfo di = new DirectoryInfo(folderPath); print(di.FullName); // 全路径 print(di.CreationTime); // 创建时间 |
用于获取详细信息(创建时间、大小等) |
适用场景 | 目录管理、文件组织 | 适合资源分类、存档管理 |
序列化反序列化二进制数据
申明可序列化对象
- 在类或结构体定义前添加
[System.Serializable]
特性 - 支持:基本类型、数组、
List<T>
、Dictionary<TKey,TValue>
、自定义结构体/类
[System.Serializable]
public class Person { … }
[System.Serializable]
public struct StructTest { … }
序列化 vs 反序列化 对比
流程 | 流 对 象 | 使用类 | 关键方法 | 说明 |
---|---|---|---|---|
序列化(内存) | MemoryStream |
BinaryFormatter |
Serialize(stream, obj) → GetBuffer() |
将对象写入内存流,获取字节数组;适合网络传输 |
序列化(文件) | FileStream |
BinaryFormatter |
Serialize(stream, obj) |
将对象直接写入文件流,保存为本地文件 |
反序列化(文件) | FileStream |
BinaryFormatter |
Deserialize(stream) → 对象 |
从本地二进制文件读取并还原为原始对象 |
反序列化(内存) | MemoryStream |
BinaryFormatter |
Deserialize(stream) → 对象 |
从字节数组构建内存流,模拟网络接收后恢复对象 |
序列化流程要点
内存流方式
- 新建
MemoryStream
- 用
BinaryFormatter.Serialize
将对象写入流 - 调用
memoryStream.GetBuffer()
获取字节数组
- 新建
文件流方式
- 新建
FileStream
(OpenOrCreate
+ 写入权限) - 用
BinaryFormatter.Serialize
将对象写入文件流 - 调用
fileStream.Flush()
保证写入,最后关闭流
- 新建
反序列化流程要点
文件流方式
- 使用
File.Open
或FileStream
打开已有二进制文件 - 用
BinaryFormatter.Deserialize
读取并转换为目标对象
- 使用
内存流方式
- 先用
File.ReadAllBytes
获取文件字节数组(模拟网络数据) - 传入
MemoryStream(bytes)
- 用
BinaryFormatter.Deserialize
恢复对象
- 先用
核心注意事项
场景 | 陷阱 | 解决方案 |
---|---|---|
字节顺序 | 小端序(C# 默认)与大端序冲突 | 网络传输时手动反转字节(如 Array.Reverse(bytes)) |
字符串存储 | 未存长度导致读取失败 | 先存 int 表示字节长度,再存字符串字节数组 |
文件流未关闭 | 数据丢失或文件被占用 | 强制使用 using 块包裹 FileStream |
编码格式 | 中文乱码(非 UTF-8) | 统一使用 Encoding.UTF8,避免 ANSI 等本地编码 |
文件夹删除 | 非空目录删除失败 | 传入 true 递归删除(Directory.Delete(path, true)) |
路径拼接 | 平台路径格式错误(如 \ vs /) | 使用 Path.Combine()(如 Path.Combine(folder, “file.bin”)) |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com