Unity之二进制文件序列化

二进制文件是什么?

在Unity中,二进制文件(Binary Files)是以二进制格式存储数据的文件。与文本文件(如XML或JSON)不同,二进制文件将数据以字节序列的形式存储在文件中,而不是以人类可读的文本形式。

Unity二进制文件通常具有以下特点:

  1. 高效存储:二进制文件可以更有效地存储数据,因为它们不需要为数据中的每个元素(如数字、字符串等)添加额外的格式或分隔符。这有助于减小文件大小,提高加载速度

  2. 高效处理:在读取或写入二进制文件时,计算机可以直接处理字节序列,而无需进行复杂的文本解析或格式转换。这使得数据访问速度更快,提高了程序的性能

  3. 安全性:由于二进制文件中的数据以字节序列的形式存储,它们通常比文本文件更难被修改或篡改。这有助于提高游戏或应用程序的安全性

  4. 非可读性:然而,二进制文件的缺点是它们不可读。这意味着人类无法直接查看或编辑二进制文件中的数据,需要使用专门的工具或库来进行解析和处理。

在Unity中,你可以使用内置的类或第三方库来读取和写入二进制文件。例如,你可以使用FileStream类结合BinaryReaderBinaryWriter类来读取和写入二进制数据。此外,Unity还提供了其他API和工具来支持二进制数据的处理,如SerializationDeserialization功能。

需要注意的是,尽管二进制文件具有许多优点,但在某些情况下,使用文本文件(如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,我们一起学习,一起成长~

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值