二进制文件是什么?
在Unity中,二进制文件(Binary Files)是以二进制格式存储数据的文件。与文本文件(如XML或JSON)不同,二进制文件将数据以字节序列的形式存储在文件中,而不是以人类可读的文本形式。
Unity二进制文件通常具有以下特点:
-
高效存储:二进制文件可以更有效地存储数据,因为它们不需要为数据中的每个元素(如数字、字符串等)添加额外的格式或分隔符。这有助于减小文件大小,提高加载速度。
-
高效处理:在读取或写入二进制文件时,计算机可以直接处理字节序列,而无需进行复杂的文本解析或格式转换。这使得数据访问速度更快,提高了程序的性能。
-
安全性:由于二进制文件中的数据以字节序列的形式存储,它们通常比文本文件更难被修改或篡改。这有助于提高游戏或应用程序的安全性。
-
非可读性:然而,二进制文件的缺点是它们不可读。这意味着人类无法直接查看或编辑二进制文件中的数据,需要使用专门的工具或库来进行解析和处理。
在Unity中,你可以使用内置的类或第三方库来读取和写入二进制文件。例如,你可以使用FileStream
类结合BinaryReader
和BinaryWriter
类来读取和写入二进制数据。此外,Unity还提供了其他API和工具来支持二进制数据的处理,如Serialization
和Deserialization
功能。
需要注意的是,尽管二进制文件具有许多优点,但在某些情况下,使用文本文件(如XML或JSON)可能更为合适。例如,当你需要人类可读的数据格式或跨平台兼容性时,文本文件可能更合适。
Unity中对象序列化成二进制文件
Hero类
/// <summary>
/// Hero类
/// </summary>
[System.Serializable] //序列化类标签(类可被序列化)
public class Hero
{
public int id; //XML序列化字段属性标签
public string name;
public int grade;
public List<string> weapon;//XML序列化数组标签
}
BinarySerialization.CS脚本挂载到空游戏物体上
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;
/// <summary>
/// XML序列化
/// </summary>
public class BinarySerialization : MonoBehaviour
{
private void Start()
{
//创建对象
Hero hero = new Hero();
hero.id = 1001;
hero.name = "umbella";
hero.grade = 99;
hero.weapon = new List<string>();
hero.weapon.Add("短刀");
hero.weapon.Add("长剑");
hero.weapon.Add("巴雷特");
//二进制序列化
BinarySerializer(hero); //调用方法 将对象序列化 --> 二进制文件
Hero DeHero = BinaryDeSerializer(); //调用方法 将二进制文件 反序列化 --> 对象
//打印对象信息
Debug.Log("id:" + DeHero.id);
Debug.Log("Name:" + DeHero.name);
Debug.Log("Grade:" + DeHero.grade);
foreach (string weapon in DeHero.weapon)
{
Debug.Log("武器:" + weapon);
}
}
/// <summary>
/// 对象 --> 二进制文件(序列化)
/// </summary>
public void BinarySerializer(Hero hero)
{
//文件流
FileStream fileStream = new FileStream(Application.dataPath + "/Hero.bytes", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
//二进制格式器
BinaryFormatter binaryFormatter = new BinaryFormatter();
//二进制格式器 序列化 :对象 -> 二进制文件
binaryFormatter.Serialize(fileStream, hero);
//文件流关闭
fileStream.Close();
}
/// <summary>
/// 二进制文件 ---> 对象 (反序列化)
/// </summary>
public Hero BinaryDeSerializer()
{
//利用编辑器模式下加载TextAsset
TextAsset textAsset = UnityEditor.AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/Hero.bytes");
//内存流 (将TextAsset 类型数据 写入内存流)
MemoryStream memoryStream = new MemoryStream(textAsset.bytes);
//创建二进制格式器
BinaryFormatter binaryFormatter = new BinaryFormatter();
//将内存流中二进制数据 反序列化成对象
object obj = binaryFormatter.Deserialize(memoryStream);
return (Hero)obj; //强制转换成Hero 并返回。
}
}
执行成功后:
Unity中二进制文件序列化成对象
Hero类
/// <summary>
/// Hero类
/// </summary>
[System.Serializable] //序列化类标签(类可被序列化)
public class Hero
{
public int id; //XML序列化字段属性标签
public string name;
public int grade;
public List<string> weapon;//XML序列化数组标签
}
BinarySerialization.CS脚本挂载到空游戏物体上
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Xml.Serialization;
using UnityEngine;
/// <summary>
/// XML序列化
/// </summary>
public class BinarySerialization : MonoBehaviour
{
private void Start()
{
Hero DeHero = BinaryDeSerializer(); //调用方法 将二进制文件 反序列化 --> 对象
//打印对象信息
Debug.Log("id:" + DeHero.id);
Debug.Log("Name:" + DeHero.name);
Debug.Log("Grade:" + DeHero.grade);
foreach (string weapon in DeHero.weapon)
{
Debug.Log("武器:" + weapon);
}
}
/// <summary>
/// 二进制文件 ---> 对象 (反序列化)
/// </summary>
public Hero BinaryDeSerializer()
{
//利用编辑器模式下加载TextAsset
TextAsset textAsset = UnityEditor.AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/Hero.bytes");
//内存流 (将TextAsset 类型数据 写入内存流)
MemoryStream memoryStream = new MemoryStream(textAsset.bytes);
//创建二进制格式器
BinaryFormatter binaryFormatter = new BinaryFormatter();
//将内存流中二进制数据 反序列化成对象
object obj = binaryFormatter.Deserialize(memoryStream);
return (Hero)obj; //强制转换成Hero 并返回。
}
}
执行成功后:
想获取更多学习资源,可以关注公众号:脚本开发者,或者加入unity交流q群:115885644,我们一起学习,一起成长~