11.Binary基础知识总结

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() 获取字节数组
  • 文件流方式

    • 新建 FileStreamOpenOrCreate + 写入权限)
    • BinaryFormatter.Serialize 将对象写入文件流
    • 调用 fileStream.Flush() 保证写入,最后关闭流

反序列化流程要点

  • 文件流方式

    • 使用 File.OpenFileStream 打开已有二进制文件
    • 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

×

喜欢就点赞,疼爱就打赏