【Unity数据交互】Unity中使用二进制进行数据持久化

在这里插入图片描述


👨‍💻个人主页@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 专栏交流🧧
🟥Unity100个实战基础✨🎁
🟦 Unity100个精华一记✨🎁
🟩 Unity50个demo案例教程✨🎁
🟨 Unity100个精华细节BUG✨🎁

在这里插入图片描述

在这里插入图片描述



前言

有符号 sbyte int short long
无符号 byte uint ushort ulong
浮点 float double decimal
特殊 bool char string

变量的本质是2进制,内存中以字节的形式存储,sizeof方法可以看到常用变量类型占用的字节空间长度

sizeof(sbyte)
sizeof(long) …

  • 节约存储空间,提升效率
  • 提升安全性

🎶(1 数据相互转换


  • 在Unity中各类型数据和字节数据相互转换

  • 1.将各类型转字节

byte[] bytes = BitConverter.GetBytes(256);
  • 2.字节数组转各类型
int i = BitConverter.ToInt32(bytes, 0);

为保证编码的正确性,编码要规范化、标准化,即需有标准的编码格式。

在C#中有一个专门的编码格式类 来帮助我们将字符串和字节数组进行转换

游戏开发中常用编码格式 UTF-8
中文相关编码格式 GBK
英文相关编码格式 ASCII

  • 1.将字符串以指定编码格式转字节
byte[] bytes = Encoding.UTF8.GetBytes("你好");
  • 2.字节数组以指定编码格式转字符串
string str = Encoding.UTF8.GetString(bytes);

🎶(2 文件操作


命名空间: System.IO

  • 1.判断文件是否存在
     if(File.Exists(Application.dataPath + "/Text"))
        {
           //存在
        }
     
  • 2.创建文件
FileStream fstream = File.Create(Application.dataPath + "/text");

  • 3.写入文件
     //字节数组 写入到指定路径的文件中
 byte[] bytes = BitConverter.GetBytes(100);
 File.WriteAllBytes(Application.dataPath + "/text", bytes);
     //string数组内容 一行行写入到指定路径中
string[] strs = new string[] { "姓名", "你好", "1", "23"};
File.WriteAllLines(Application.dataPath + "/text", strs);
     //字符串写入指定路径
File.WriteAllText(Application.dataPath + "/text", "xahhll");
  • 4.读取文件
        //读取字节数据
 bytes = File.ReadAllBytes(Application.dataPath + "/text");
 print(BitConverter.ToInt32(bytes, 0));
        //读取所有行信息
strs = File.ReadAllLines(Application.dataPath + "/text");
        for (int i = 0; i < strs.Length; i++)
        {
            print(strs[i]);
        }
        //读取所有文本信息
print(File.ReadAllText(Application.dataPath + "/text"));
  • 5.删除文件
  File.Delete(Application.dataPath + "/text");//文件前提是关闭的
  • 6.复制文件
参数一:现有文件 需要是流关闭状态
参数二:目标文件
        File.Copy(Application.dataPath + "/text", Application.dataPath + "/text2", true);
  • 7.文件替换
        //参数一:用来替换的路径
        //参数二:被替换的路径
        //参数三:备份路径
 File.Replace(Application.dataPath + "/text", 
 Application.dataPath + "/text2", Application.dataPath + "/备份text");

  • 8.以流的形式 打开文件并写入或读取

//参数一:路径
//参数二:打开模式
//参数三:访问模式
FileStream fs = File.Open(Application.dataPath + "/text", 
FileMode.OpenOrCreate, FileAccess.ReadWrite);
      

🎶(3 文件夹操作


命名空间:using System.IO
作用:增删查改文件夹

  • 1.判断文件夹是否存在
if( Directory.Exists(Application.dataPath + "/文件夹名"))
{
    print("存在");
}
  • 2.创建文件夹
DirectoryInfo info = Directory.CreateDirectory(Application.dataPath + "/文件夹名");
  • 3.删除文件夹
//参数一:路径
//参数二:true,将删除整个目录,false,仅当该目录为空时才删除
Directory.Delete(Application.dataPath + "/文件夹名");
  • 4.查找文件夹和文件
//得到所有文件夹名
string[] strs = Directory.GetDirectories(Application.dataPath);
for (int i = 0; i < strs.Length; i++)
{
    print(strs[i]);
}
//得到所有文件名
strs = Directory.GetFiles(Application.dataPath);
for (int i = 0; i < strs.Length; i++)
{
    print(strs[i]);
}

  • 5.移动文件夹
//移动会把文件夹中的所有内容一起移到新的路径
Directory.Move(Application.dataPath + "/文件夹名", Application.dataPath + "/路径");//该路径下面需为空
  • 6.创建文件夹方法的返回值
DirectoryInfo Info = Directory.CreateDirectory(Application.dataPath + "/文件夹名");
//全路径
print(Info .FullName);
//文件名
print(Info .Name);
  • 7.查找上级文件夹信息
Info = Directory.GetParent(Application.dataPath + "/文件夹名");
//全路径
print(Info .FullName);
//文件名
print(Info .Name);
  • 8.得到所有子文件夹的目录信息
DirectoryInfo[] dInfos = Info.GetDirectories();
FileInfo[] fInfos = dInfo.GetFiles();
for (int i = 0; i < fInfos.Length; i++)
{
    print("**************");
    print(fInfos[i].Name);//文件名
    print(fInfos[i].FullName);//路径
    print(fInfos[i].Length);//字节长度
    print(fInfos[i].Extension);//后缀名
}


🎶(4 序列化


序列化类对象

  • 1.第一步申明类对象

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

  • 第二步—将对象进行2进制序列化
  Person p = new Person();        
        //主要方法:序列化方法 Serialize
        using (MemoryStream ms = new MemoryStream())
        {
            //2进制格式化程序
            BinaryFormatter bf = new BinaryFormatter();
            //序列化对象 生成2进制字节数组 写入到内存流当中
            bf.Serialize(ms, p);
            //得到对象的2进制字节数组
            byte[] bytes = ms.GetBuffer();
            //存储字节
            File.WriteAllBytes(Application.dataPath + "/文件", bytes);
            //关闭内存流
            ms.Close();
        }

方法二:使用文件流进行存储
主要用于存储到文件中

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



🎶(5 反序列化


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

            fs.Close();
        }
  • 2.反序列化网络传输过来的2进制数据

没有网络传输 就直接从文件中获取

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

🎶(6二进制加密


  • 简单的异或加密和解密
       Person p = new Person();
        byte key = 199;
        using (MemoryStream ms = new MemoryStream())
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, p);
            byte[] bytes = ms.GetBuffer();
            //异或加密
            for (int i = 0; i < bytes.Length; i++)
            {
                bytes[i] ^= key;
            }
            File.WriteAllBytes(Application.dataPath + "/文件夹名", bytes);
        }
        //解密
        byte[] bytes2 = File.ReadAllBytes(Application.dataPath + "/文件夹名");
        for (int i = 0; i < bytes2.Length; i++)
        {
            bytes2[i] ^= key;
        }
        using (MemoryStream ms = new MemoryStream(bytes2))
        {
            BinaryFormatter bf = new BinaryFormatter();
            Person p2 = bf.Deserialize(ms) as Person;
            ms.Close();
        }

🎶(7 BinaryData管理器


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

/// <summary>
/// 2进制数据管理器
/// </summary>
public class BinaryDataMgr
{
    /// <summary>
    /// 2进制数据存储位置路径
    /// </summary>
    public static string DATA_BINARY_PATH = Application.streamingAssetsPath + "/Binary/";

    /// <summary>
    /// 用于存储所有Excel表数据的容器
    /// </summary>
    private Dictionary<string, object> tableDic = new Dictionary<string, object>();

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

    private static BinaryDataMgr instance = new BinaryDataMgr();
    public static BinaryDataMgr Instance => instance;

//------后续代码请私信获取——————————————————————————
}


在这里插入图片描述

🅰️系统路线学习点击跳转


👨‍💻 Unity程序基础学习路线🧧
⭐【Unityc#专题篇】之c#进阶篇】🎁
⭐【Unityc#专题篇】之c#核心篇】🎁
⭐【Unityc#专题篇】之c#基础篇】🎁
⭐【Unity-c#专题篇】之c#入门篇】🎁
【Unityc#专题篇】—进阶章题单实践练习🎁
⭐【Unityc#专题篇】—基础章题单实践练习🎁
【Unityc#专题篇】—核心章题单实践练习🎁

你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秩沅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值