BuiltinVersionListSerializer.PackageVersionListSerializeCallback.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 loyalsoft. All rights reserved.
  4. // Homepage: http://www.game7000.com/
  5. // Feedback: http://www.game7000.com/
  6. //------------------------------------------------------------
  7. using GameFramework;
  8. using GameFramework.Resource;
  9. using System;
  10. using System.IO;
  11. using System.Text;
  12. namespace UnityGameFramework.Runtime
  13. {
  14. /// <summary>
  15. /// 内置版本资源列表序列化器。
  16. /// </summary>
  17. public static partial class BuiltinVersionListSerializer
  18. {
  19. #if UNITY_EDITOR
  20. /// <summary>
  21. /// 序列化单机模式版本资源列表(版本 0)回调函数。
  22. /// </summary>
  23. /// <param name="stream">目标流。</param>
  24. /// <param name="versionList">要序列化的单机模式版本资源列表(版本 0)。</param>
  25. /// <returns>是否序列化单机模式版本资源列表(版本 0)成功。</returns>
  26. public static bool PackageVersionListSerializeCallback_V0(Stream stream, PackageVersionList versionList)
  27. {
  28. if (!versionList.IsValid)
  29. {
  30. return false;
  31. }
  32. Utility.Random.GetRandomBytes(s_CachedHashBytes);
  33. using (BinaryWriter binaryWriter = new BinaryWriter(stream, Encoding.UTF8))
  34. {
  35. binaryWriter.Write(s_CachedHashBytes);
  36. binaryWriter.WriteEncryptedString(versionList.ApplicableGameVersion, s_CachedHashBytes);
  37. binaryWriter.Write(versionList.InternalResourceVersion);
  38. PackageVersionList.Asset[] assets = versionList.GetAssets();
  39. binaryWriter.Write(assets.Length);
  40. PackageVersionList.Resource[] resources = versionList.GetResources();
  41. binaryWriter.Write(resources.Length);
  42. foreach (PackageVersionList.Resource resource in resources)
  43. {
  44. binaryWriter.WriteEncryptedString(resource.Name, s_CachedHashBytes);
  45. binaryWriter.WriteEncryptedString(resource.Variant, s_CachedHashBytes);
  46. binaryWriter.Write(resource.LoadType);
  47. binaryWriter.Write(resource.Length);
  48. binaryWriter.Write(resource.HashCode);
  49. int[] assetIndexes = resource.GetAssetIndexes();
  50. binaryWriter.Write(assetIndexes.Length);
  51. byte[] hashBytes = new byte[CachedHashBytesLength];
  52. foreach (int assetIndex in assetIndexes)
  53. {
  54. Utility.Converter.GetBytes(resource.HashCode, hashBytes);
  55. PackageVersionList.Asset asset = assets[assetIndex];
  56. binaryWriter.WriteEncryptedString(asset.Name, hashBytes);
  57. int[] dependencyAssetIndexes = asset.GetDependencyAssetIndexes();
  58. binaryWriter.Write(dependencyAssetIndexes.Length);
  59. foreach (int dependencyAssetIndex in dependencyAssetIndexes)
  60. {
  61. binaryWriter.WriteEncryptedString(assets[dependencyAssetIndex].Name, hashBytes);
  62. }
  63. }
  64. }
  65. PackageVersionList.ResourceGroup[] resourceGroups = versionList.GetResourceGroups();
  66. binaryWriter.Write(resourceGroups.Length);
  67. foreach (PackageVersionList.ResourceGroup resourceGroup in resourceGroups)
  68. {
  69. binaryWriter.WriteEncryptedString(resourceGroup.Name, s_CachedHashBytes);
  70. int[] resourceIndexes = resourceGroup.GetResourceIndexes();
  71. binaryWriter.Write(resourceIndexes.Length);
  72. foreach (ushort resourceIndex in resourceIndexes)
  73. {
  74. binaryWriter.Write(resourceIndex);
  75. }
  76. }
  77. }
  78. Array.Clear(s_CachedHashBytes, 0, CachedHashBytesLength);
  79. return true;
  80. }
  81. /// <summary>
  82. /// 序列化单机模式版本资源列表(版本 1)回调函数。
  83. /// </summary>
  84. /// <param name="stream">目标流。</param>
  85. /// <param name="versionList">要序列化的单机模式版本资源列表(版本 1)。</param>
  86. /// <returns>是否序列化单机模式版本资源列表(版本 1)成功。</returns>
  87. public static bool PackageVersionListSerializeCallback_V1(Stream stream, PackageVersionList versionList)
  88. {
  89. if (!versionList.IsValid)
  90. {
  91. return false;
  92. }
  93. Utility.Random.GetRandomBytes(s_CachedHashBytes);
  94. using (BinaryWriter binaryWriter = new BinaryWriter(stream, Encoding.UTF8))
  95. {
  96. binaryWriter.Write(s_CachedHashBytes);
  97. binaryWriter.WriteEncryptedString(versionList.ApplicableGameVersion, s_CachedHashBytes);
  98. binaryWriter.Write7BitEncodedInt32(versionList.InternalResourceVersion);
  99. PackageVersionList.Asset[] assets = versionList.GetAssets();
  100. binaryWriter.Write7BitEncodedInt32(assets.Length);
  101. foreach (PackageVersionList.Asset asset in assets)
  102. {
  103. binaryWriter.WriteEncryptedString(asset.Name, s_CachedHashBytes);
  104. int[] dependencyAssetIndexes = asset.GetDependencyAssetIndexes();
  105. binaryWriter.Write7BitEncodedInt32(dependencyAssetIndexes.Length);
  106. foreach (int dependencyAssetIndex in dependencyAssetIndexes)
  107. {
  108. binaryWriter.Write7BitEncodedInt32(dependencyAssetIndex);
  109. }
  110. }
  111. PackageVersionList.Resource[] resources = versionList.GetResources();
  112. binaryWriter.Write7BitEncodedInt32(resources.Length);
  113. foreach (PackageVersionList.Resource resource in resources)
  114. {
  115. binaryWriter.WriteEncryptedString(resource.Name, s_CachedHashBytes);
  116. binaryWriter.WriteEncryptedString(resource.Variant, s_CachedHashBytes);
  117. binaryWriter.WriteEncryptedString(resource.Extension != DefaultExtension ? resource.Extension : null, s_CachedHashBytes);
  118. binaryWriter.Write(resource.LoadType);
  119. binaryWriter.Write7BitEncodedInt32(resource.Length);
  120. binaryWriter.Write(resource.HashCode);
  121. int[] assetIndexes = resource.GetAssetIndexes();
  122. binaryWriter.Write7BitEncodedInt32(assetIndexes.Length);
  123. foreach (int assetIndex in assetIndexes)
  124. {
  125. binaryWriter.Write7BitEncodedInt32(assetIndex);
  126. }
  127. }
  128. PackageVersionList.ResourceGroup[] resourceGroups = versionList.GetResourceGroups();
  129. binaryWriter.Write7BitEncodedInt32(resourceGroups.Length);
  130. foreach (PackageVersionList.ResourceGroup resourceGroup in resourceGroups)
  131. {
  132. binaryWriter.WriteEncryptedString(resourceGroup.Name, s_CachedHashBytes);
  133. int[] resourceIndexes = resourceGroup.GetResourceIndexes();
  134. binaryWriter.Write7BitEncodedInt32(resourceIndexes.Length);
  135. foreach (int resourceIndex in resourceIndexes)
  136. {
  137. binaryWriter.Write7BitEncodedInt32(resourceIndex);
  138. }
  139. }
  140. }
  141. Array.Clear(s_CachedHashBytes, 0, CachedHashBytesLength);
  142. return true;
  143. }
  144. /// <summary>
  145. /// 序列化单机模式版本资源列表(版本 2)回调函数。
  146. /// </summary>
  147. /// <param name="stream">目标流。</param>
  148. /// <param name="versionList">要序列化的单机模式版本资源列表(版本 2)。</param>
  149. /// <returns>是否序列化单机模式版本资源列表(版本 2)成功。</returns>
  150. public static bool PackageVersionListSerializeCallback_V2(Stream stream, PackageVersionList versionList)
  151. {
  152. if (!versionList.IsValid)
  153. {
  154. return false;
  155. }
  156. Utility.Random.GetRandomBytes(s_CachedHashBytes);
  157. using (BinaryWriter binaryWriter = new BinaryWriter(stream, Encoding.UTF8))
  158. {
  159. binaryWriter.Write(s_CachedHashBytes);
  160. binaryWriter.WriteEncryptedString(versionList.ApplicableGameVersion, s_CachedHashBytes);
  161. binaryWriter.Write7BitEncodedInt32(versionList.InternalResourceVersion);
  162. PackageVersionList.Asset[] assets = versionList.GetAssets();
  163. binaryWriter.Write7BitEncodedInt32(assets.Length);
  164. foreach (PackageVersionList.Asset asset in assets)
  165. {
  166. binaryWriter.WriteEncryptedString(asset.Name, s_CachedHashBytes);
  167. int[] dependencyAssetIndexes = asset.GetDependencyAssetIndexes();
  168. binaryWriter.Write7BitEncodedInt32(dependencyAssetIndexes.Length);
  169. foreach (int dependencyAssetIndex in dependencyAssetIndexes)
  170. {
  171. binaryWriter.Write7BitEncodedInt32(dependencyAssetIndex);
  172. }
  173. }
  174. PackageVersionList.Resource[] resources = versionList.GetResources();
  175. binaryWriter.Write7BitEncodedInt32(resources.Length);
  176. foreach (PackageVersionList.Resource resource in resources)
  177. {
  178. binaryWriter.WriteEncryptedString(resource.Name, s_CachedHashBytes);
  179. binaryWriter.WriteEncryptedString(resource.Variant, s_CachedHashBytes);
  180. binaryWriter.WriteEncryptedString(resource.Extension != DefaultExtension ? resource.Extension : null, s_CachedHashBytes);
  181. binaryWriter.Write(resource.LoadType);
  182. binaryWriter.Write7BitEncodedInt32(resource.Length);
  183. binaryWriter.Write(resource.HashCode);
  184. int[] assetIndexes = resource.GetAssetIndexes();
  185. binaryWriter.Write7BitEncodedInt32(assetIndexes.Length);
  186. foreach (int assetIndex in assetIndexes)
  187. {
  188. binaryWriter.Write7BitEncodedInt32(assetIndex);
  189. }
  190. }
  191. PackageVersionList.FileSystem[] fileSystems = versionList.GetFileSystems();
  192. binaryWriter.Write7BitEncodedInt32(fileSystems.Length);
  193. foreach (PackageVersionList.FileSystem fileSystem in fileSystems)
  194. {
  195. binaryWriter.WriteEncryptedString(fileSystem.Name, s_CachedHashBytes);
  196. int[] resourceIndexes = fileSystem.GetResourceIndexes();
  197. binaryWriter.Write7BitEncodedInt32(resourceIndexes.Length);
  198. foreach (int resourceIndex in resourceIndexes)
  199. {
  200. binaryWriter.Write7BitEncodedInt32(resourceIndex);
  201. }
  202. }
  203. PackageVersionList.ResourceGroup[] resourceGroups = versionList.GetResourceGroups();
  204. binaryWriter.Write7BitEncodedInt32(resourceGroups.Length);
  205. foreach (PackageVersionList.ResourceGroup resourceGroup in resourceGroups)
  206. {
  207. binaryWriter.WriteEncryptedString(resourceGroup.Name, s_CachedHashBytes);
  208. int[] resourceIndexes = resourceGroup.GetResourceIndexes();
  209. binaryWriter.Write7BitEncodedInt32(resourceIndexes.Length);
  210. foreach (int resourceIndex in resourceIndexes)
  211. {
  212. binaryWriter.Write7BitEncodedInt32(resourceIndex);
  213. }
  214. }
  215. }
  216. Array.Clear(s_CachedHashBytes, 0, CachedHashBytesLength);
  217. return true;
  218. }
  219. #endif
  220. }
  221. }