using System; using System.IO; using System.Collections.Generic; using UnityEngine; namespace YooAsset { internal static class CatalogTools { /// /// 序列化(JSON文件) /// public static void SerializeToJson(string savePath, DefaultBuildinFileCatalog catalog) { string json = JsonUtility.ToJson(catalog, true); FileUtility.WriteAllText(savePath, json); } /// /// 反序列化(JSON文件) /// public static DefaultBuildinFileCatalog DeserializeFromJson(string jsonContent) { return JsonUtility.FromJson(jsonContent); } /// /// 序列化(二进制文件) /// public static void SerializeToBinary(string savePath, DefaultBuildinFileCatalog catalog) { using (FileStream fs = new FileStream(savePath, FileMode.Create)) { // 创建缓存器 BufferWriter buffer = new BufferWriter(CatalogDefine.FileMaxSize); // 写入文件标记 buffer.WriteUInt32(CatalogDefine.FileSign); // 写入文件版本 buffer.WriteUTF8(CatalogDefine.FileVersion); // 写入文件头信息 buffer.WriteUTF8(catalog.PackageName); buffer.WriteUTF8(catalog.PackageVersion); // 写入资源包列表 buffer.WriteInt32(catalog.Wrappers.Count); for (int i = 0; i < catalog.Wrappers.Count; i++) { var fileWrapper = catalog.Wrappers[i]; buffer.WriteUTF8(fileWrapper.BundleGUID); buffer.WriteUTF8(fileWrapper.FileName); } // 写入文件流 buffer.WriteToStream(fs); fs.Flush(); } } /// /// 反序列化(二进制文件) /// public static DefaultBuildinFileCatalog DeserializeFromBinary(byte[] binaryData) { // 创建缓存器 BufferReader buffer = new BufferReader(binaryData); // 读取文件标记 uint fileSign = buffer.ReadUInt32(); if (fileSign != CatalogDefine.FileSign) throw new Exception("Invalid catalog file !"); // 读取文件版本 string fileVersion = buffer.ReadUTF8(); if (fileVersion != CatalogDefine.FileVersion) throw new Exception($"The catalog file version are not compatible : {fileVersion} != {CatalogDefine.FileVersion}"); DefaultBuildinFileCatalog catalog = new DefaultBuildinFileCatalog(); { // 读取文件头信息 catalog.FileVersion = fileVersion; catalog.PackageName = buffer.ReadUTF8(); catalog.PackageVersion = buffer.ReadUTF8(); // 读取资源包列表 int fileCount = buffer.ReadInt32(); catalog.Wrappers = new List(fileCount); for (int i = 0; i < fileCount; i++) { var fileWrapper = new DefaultBuildinFileCatalog.FileWrapper(); fileWrapper.BundleGUID = buffer.ReadUTF8(); fileWrapper.FileName = buffer.ReadUTF8(); catalog.Wrappers.Add(fileWrapper); } } return catalog; } } }