【Unity數據交互】Unity中使用二進制進行數據持久化

在這里插入圖片描述


👨?💻個人主頁:@元宇宙-秩沅

👨?💻 hallo 歡迎 點贊👍 收藏? 留言📝 加關注?!

👨?💻 本文由 秩沅 原創

👨?💻 專欄交流🧧
🟥Unity100個實戰基礎?🎁
🟦 Unity100個精華一記?🎁
🟩 Unity50個demo案例教程?🎁
🟨 Unity100個精華細節BUG?🎁

在這里插入圖片描述

在這里插入圖片描述


文章目錄

    • ?前言?
    • 🎶(==1==) 數據相互轉換
    • 🎶(==2==) 文件操作
    • 🎶(==3==) 文件夾操作
    • 🎶(==4==) 序列化
    • 🎶(==5==) 反序列化
    • 🎶(==6==)二進制加密
    • 🎶(==7==) BinaryData管理器
    • ?🅰?系統路線學習點擊跳轉?


?前言?

有符號 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();        //主要方法:序列化方法 Serializeusing (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#專題篇】—核心章題單實踐練習🎁

你們的點贊👍 收藏? 留言📝 關注?是我持續創作,輸出優質內容的最大動力!


在這里插入圖片描述


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40624.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40624.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SqlSugar分表筆記

1、使用SqlSugar的分表功能時&#xff0c;.net要使用.net core&#xff1b; 我開始使用的是.net freamwork4.72&#xff0c;程序報異常&#xff0c;沒能解決&#xff0c;換到.net core下面就正常&#xff1b; 2、SqlSugar自帶分表支持按季度、月、周、日進行分表&#x…

ArcGIS Pro SDK (七)編輯 15 版本控制選項

ArcGIS Pro SDK &#xff08;七&#xff09;編輯 15 版本控制選項 文章目錄 ArcGIS Pro SDK &#xff08;七&#xff09;編輯 15 版本控制選項獲取和設置版本控制選項 環境&#xff1a;Visual Studio 2022 .NET6 ArcGIS Pro SDK 3.0 獲取和設置版本控制選項 var vOptions A…

PostgreSQL 技術內幕(十七):FDW 實現原理與源碼解析

對于一定規模的系統而言&#xff0c;數據倉庫往往需要訪問外部數據來完成分析和計算。外部數據包裝器&#xff08;Foreign Data Wrapper&#xff0c; 簡稱 FDW&#xff09;是 PostgreSQL 提供的訪問外部數據源機制。用戶可以使用簡單的 SQL 語句訪問和操作外部數據源&#xff0…

Python面試題:Python 中的生成器(generator)是什么?有什么優點?

在Python中&#xff0c;生成器&#xff08;generator&#xff09;是一種特殊的迭代器&#xff0c;使用yield關鍵字生成值&#xff0c;可以逐個生成序列中的值&#xff0c;而不需要一次性將所有值加載到內存中。生成器函數在定義時使用def關鍵字&#xff0c;并包含一個或多個yie…

[word] Word如何快速生成一段文本 #知識分享#學習方法

Word如何快速生成一段文本 Word如何快速生成一段文本&#xff1f;有時候我們會用一大段文字來做一些功能測試&#xff0c;不少朋友的做法就是臉滾鍵盤&#xff0c;一頓亂按&#xff0c;這樣看起來文筆不通&#xff0c;看著也會比較難受&#xff0c;測試功能的效果也不怎么理想…

uniapp中實現跳轉鏈接到游覽器(安卓-h5)

uniapp中實現跳轉鏈接到游覽器&#xff08;安卓-h5&#xff09; 項目中需要做到跳轉到外部鏈接&#xff0c;網上找了很多都不是很符合自己的要求&#xff0c;需要編譯成app后是跳轉到游覽器打開鏈接&#xff0c;編譯成web是在新窗口打開鏈接。實現的代碼如下&#xff1a; 效果&…

java基于ssm+vue 旅游信息資源平臺

1前臺首頁功能模塊 旅游資源網站 &#xff0c;在系統首頁可以查看首頁、景點信息、酒店信息、客房信息、交流論壇、紅色文化、個人中心、后臺管理、客服等內容&#xff0c;如圖1所示。 圖1系統功能界面圖 用戶登錄、用戶注冊&#xff0c;在注冊頁面可以填寫用戶名、密碼、姓名…

Redis GEO 功能解析

Redis GEO 功能解析 引言 Redis GEO 是 Redis 數據庫提供的一個特殊功能,用于存儲地理位置信息,并支持基于地理位置的查詢。這一功能對于需要處理地理位置數據的現代應用程序來說非常寶貴,如外賣配送、社交媒體、地圖服務等。本文將詳細介紹 Redis GEO 的功能、使用方法,…

DFS之剪枝與優化——AcWing 165. 小貓爬山

DFS之剪枝與優化 定義 DFS之剪枝與優化指的是在執行深度優先搜索(DFS, Depth-First Search)時&#xff0c;采取的一系列策略來減少搜索空間&#xff0c;避免無效計算&#xff0c;從而加速找到問題的解。剪枝是指在搜索過程中&#xff0c;當遇到某些條件不符合解的要求或者可以…

產科管理信息系統源碼:產科電子病歷、高危孕產婦五色管理系統源碼 孕產婦健康管理信息平臺源碼

產科管理信息系統源碼&#xff1a;產科電子病歷、高危孕產婦五色管理系統源碼 孕產婦健康管理信息平臺源碼 產科電子病歷系統是以采集病人在整個醫療護理過程中所產生的各種信息。包括病案首頁、門診病歷、住院病歷、出院記錄、病人病程記錄等全部病歷文書&#xff1b;涵蓋文字…

宿舍報修小程序的設計

管理員賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;管理員管理&#xff0c;基礎數據管理&#xff0c;論壇管理&#xff0c;故障上報管理&#xff0c;新聞信息管理&#xff0c;維修人員管理 微信端賬號功能包括&#xff1a;系統首頁&#xff0c;新聞信息…

node.js外賣小程序-計算機畢業設計源碼81838

摘要 自從計算機發展開始&#xff0c;計算機軟硬件相關技術的發展速度越來越快&#xff0c;在信息化高速發展的今天&#xff0c;計算機應用技術似乎已經應用到了各個領域。在餐飲行業&#xff0c;除了外賣以外就是到店里就餐&#xff0c;在店里就餐如果需要等待點餐的話&…

轉盤輸入法-單獨鼠標版本

序 轉盤輸入法&#xff0c;給你的聊天加點新意。它不用常見的九宮格或全鍵盤&#xff0c;而是把字母擺在圓盤上&#xff0c;一滑一滑&#xff0c;字就出來了&#xff0c;新鮮又直接。 單獨鼠標版本GIF演示 演示軟件下載 轉盤輸入法https://download.csdn.net/download/u0146…

zdppy+vue3+antd 實現表格數據渲染

基本用法 <template><a-table :columns"columns" :data-source"data"><template #headerCell"{ column }"><template v-if"column.key name"><span>xxx Name</span></template></temp…

免費鼠標連點器有嗎?需要付費嗎?鼠標連點器電腦版免費推薦6款!

在數字化時代&#xff0c;鼠標連點器成為了許多用戶提高工作效率、優化游戲體驗的得力助手。然而&#xff0c;面對市場上琳瑯滿目的鼠標連點器軟件&#xff0c;很多用戶都會產生疑問&#xff1a;是否有免費的鼠標連點器&#xff1f;它們真的需要付費嗎&#xff1f;今天&#xf…

名企面試必問30題(二十二)——你對加班的看法?

1.思路 實際上&#xff0c;很多公司詢問此問題&#xff0c;并非表明一定要加班&#xff0c;只是想測試您是否愿意為公司奉獻。在回答時&#xff0c;一定不能有諸如不接受加班、不接受 996 等話語&#xff0c;因為沒有公司能承諾永遠不加班。主要回答應圍繞因何原因加班&#xf…

lua入門(1) - 基本語法

本文參考自&#xff1a; Lua 基本語法 | 菜鳥教程 (runoob.com) 需要更加詳細了解的還請參看lua 上方鏈接 交互式編程 Lua 提供了交互式編程模式。我們可以在命令行中輸入程序并立即查看效果。 Lua 交互式編程模式可以通過命令 lua -i 或 lua 來啟用&#xff1a; 如下圖: 按…

物理刪除和邏輯刪除區別

物理刪除和邏輯刪除是數據庫管理中針對記錄刪除操作的兩種不同方式&#xff0c;它們的主要區別在于數據的實際處理和后續影響&#xff1a; 物理刪除&#xff1a; 操作實質&#xff1a;物理刪除會將數據記錄從數據庫表中徹底移除&#xff0c;包括記錄所占的磁盤空間都會被釋放。…

Vue3 對跳轉 同一路由傳入不同參數的頁面分別進行緩存

1&#xff1a;使用場景 從列表頁跳轉至不同的詳情頁面&#xff0c;對這些詳情頁面分別進行緩存 2&#xff1a;核心代碼 2.1: 配置路由文件 在路由文件里對需要進行緩存的路由對象添加meta 屬性 // 需要緩存的詳情頁面路由 { name: detail, path: /myRouter/detail…

十大排序:插入/希爾/選擇/堆/冒泡/快速/歸并/計數/基數/桶排序 匯總(C語言)

目錄 前言非線性時間比較類插入排序(1) 直接插入排序(2) 希爾排序 選擇排序(3) 選擇排序優化版(4) 堆排序 交換排序(5) 冒泡排序(6) 快速排序hoare版本挖坑版前后指針版非遞歸版 歸并排序(7) 歸并排序遞歸版非遞歸版 線性時間比較類(8) 計數排序基數排序與桶排序 總結 前言 在計…