BuiltinVersionListSerializer.UpdatableVersionListDeserializeCallback.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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.Collections.Generic;
  11. using System.IO;
  12. using System.Text;
  13. namespace UnityGameFramework.Runtime
  14. {
  15. /// <summary>
  16. /// 内置版本资源列表序列化器。
  17. /// </summary>
  18. public static partial class BuiltinVersionListSerializer
  19. {
  20. /// <summary>
  21. /// 反序列化可更新模式版本资源列表(版本 0)回调函数。
  22. /// </summary>
  23. /// <param name="stream">指定流。</param>
  24. /// <returns>反序列化的可更新模式版本资源列表(版本 0)。</returns>
  25. public static UpdatableVersionList UpdatableVersionListDeserializeCallback_V0(Stream stream)
  26. {
  27. using (BinaryReader binaryReader = new BinaryReader(stream, Encoding.UTF8))
  28. {
  29. byte[] encryptBytes = binaryReader.ReadBytes(CachedHashBytesLength);
  30. string applicableGameVersion = binaryReader.ReadEncryptedString(encryptBytes);
  31. int internalResourceVersion = binaryReader.ReadInt32();
  32. int assetCount = binaryReader.ReadInt32();
  33. UpdatableVersionList.Asset[] assets = assetCount > 0 ? new UpdatableVersionList.Asset[assetCount] : null;
  34. int resourceCount = binaryReader.ReadInt32();
  35. UpdatableVersionList.Resource[] resources = resourceCount > 0 ? new UpdatableVersionList.Resource[resourceCount] : null;
  36. string[][] resourceToAssetNames = new string[resourceCount][];
  37. List<KeyValuePair<string, string[]>> assetNameToDependencyAssetNames = new List<KeyValuePair<string, string[]>>(assetCount);
  38. for (int i = 0; i < resourceCount; i++)
  39. {
  40. string name = binaryReader.ReadEncryptedString(encryptBytes);
  41. string variant = binaryReader.ReadEncryptedString(encryptBytes);
  42. byte loadType = binaryReader.ReadByte();
  43. int length = binaryReader.ReadInt32();
  44. int hashCode = binaryReader.ReadInt32();
  45. int compressedLength = binaryReader.ReadInt32();
  46. int compressedHashCode = binaryReader.ReadInt32();
  47. Utility.Converter.GetBytes(hashCode, s_CachedHashBytes);
  48. int assetNameCount = binaryReader.ReadInt32();
  49. string[] assetNames = assetNameCount > 0 ? new string[assetNameCount] : null;
  50. for (int j = 0; j < assetNameCount; j++)
  51. {
  52. assetNames[j] = binaryReader.ReadEncryptedString(s_CachedHashBytes);
  53. int dependencyAssetNameCount = binaryReader.ReadInt32();
  54. string[] dependencyAssetNames = dependencyAssetNameCount > 0 ? new string[dependencyAssetNameCount] : null;
  55. for (int k = 0; k < dependencyAssetNameCount; k++)
  56. {
  57. dependencyAssetNames[k] = binaryReader.ReadEncryptedString(s_CachedHashBytes);
  58. }
  59. assetNameToDependencyAssetNames.Add(new KeyValuePair<string, string[]>(assetNames[j], dependencyAssetNames));
  60. }
  61. resourceToAssetNames[i] = assetNames;
  62. resources[i] = new UpdatableVersionList.Resource(name, variant, null, loadType, length, hashCode, compressedLength, compressedHashCode, assetNameCount > 0 ? new int[assetNameCount] : null);
  63. }
  64. assetNameToDependencyAssetNames.Sort(AssetNameToDependencyAssetNamesComparer);
  65. Array.Clear(s_CachedHashBytes, 0, CachedHashBytesLength);
  66. int index = 0;
  67. foreach (KeyValuePair<string, string[]> i in assetNameToDependencyAssetNames)
  68. {
  69. if (i.Value != null)
  70. {
  71. int[] dependencyAssetIndexes = new int[i.Value.Length];
  72. for (int j = 0; j < i.Value.Length; j++)
  73. {
  74. dependencyAssetIndexes[j] = GetAssetNameIndex(assetNameToDependencyAssetNames, i.Value[j]);
  75. }
  76. assets[index++] = new UpdatableVersionList.Asset(i.Key, dependencyAssetIndexes);
  77. }
  78. else
  79. {
  80. assets[index++] = new UpdatableVersionList.Asset(i.Key, null);
  81. }
  82. }
  83. for (int i = 0; i < resources.Length; i++)
  84. {
  85. int[] assetIndexes = resources[i].GetAssetIndexes();
  86. for (int j = 0; j < assetIndexes.Length; j++)
  87. {
  88. assetIndexes[j] = GetAssetNameIndex(assetNameToDependencyAssetNames, resourceToAssetNames[i][j]);
  89. }
  90. }
  91. int resourceGroupCount = binaryReader.ReadInt32();
  92. UpdatableVersionList.ResourceGroup[] resourceGroups = resourceGroupCount > 0 ? new UpdatableVersionList.ResourceGroup[resourceGroupCount] : null;
  93. for (int i = 0; i < resourceGroupCount; i++)
  94. {
  95. string name = binaryReader.ReadEncryptedString(encryptBytes);
  96. int resourceIndexCount = binaryReader.ReadInt32();
  97. int[] resourceIndexes = resourceIndexCount > 0 ? new int[resourceIndexCount] : null;
  98. for (int j = 0; j < resourceIndexCount; j++)
  99. {
  100. resourceIndexes[j] = binaryReader.ReadUInt16();
  101. }
  102. resourceGroups[i] = new UpdatableVersionList.ResourceGroup(name, resourceIndexes);
  103. }
  104. return new UpdatableVersionList(applicableGameVersion, internalResourceVersion, assets, resources, null, resourceGroups);
  105. }
  106. }
  107. /// <summary>
  108. /// 反序列化可更新模式版本资源列表(版本 1)回调函数。
  109. /// </summary>
  110. /// <param name="stream">指定流。</param>
  111. /// <returns>反序列化的可更新模式版本资源列表(版本 1)。</returns>
  112. public static UpdatableVersionList UpdatableVersionListDeserializeCallback_V1(Stream stream)
  113. {
  114. using (BinaryReader binaryReader = new BinaryReader(stream, Encoding.UTF8))
  115. {
  116. byte[] encryptBytes = binaryReader.ReadBytes(CachedHashBytesLength);
  117. string applicableGameVersion = binaryReader.ReadEncryptedString(encryptBytes);
  118. int internalResourceVersion = binaryReader.Read7BitEncodedInt32();
  119. int assetCount = binaryReader.Read7BitEncodedInt32();
  120. UpdatableVersionList.Asset[] assets = assetCount > 0 ? new UpdatableVersionList.Asset[assetCount] : null;
  121. for (int i = 0; i < assetCount; i++)
  122. {
  123. string name = binaryReader.ReadEncryptedString(encryptBytes);
  124. int dependencyAssetCount = binaryReader.Read7BitEncodedInt32();
  125. int[] dependencyAssetIndexes = dependencyAssetCount > 0 ? new int[dependencyAssetCount] : null;
  126. for (int j = 0; j < dependencyAssetCount; j++)
  127. {
  128. dependencyAssetIndexes[j] = binaryReader.Read7BitEncodedInt32();
  129. }
  130. assets[i] = new UpdatableVersionList.Asset(name, dependencyAssetIndexes);
  131. }
  132. int resourceCount = binaryReader.Read7BitEncodedInt32();
  133. UpdatableVersionList.Resource[] resources = resourceCount > 0 ? new UpdatableVersionList.Resource[resourceCount] : null;
  134. for (int i = 0; i < resourceCount; i++)
  135. {
  136. string name = binaryReader.ReadEncryptedString(encryptBytes);
  137. string variant = binaryReader.ReadEncryptedString(encryptBytes);
  138. string extension = binaryReader.ReadEncryptedString(encryptBytes) ?? DefaultExtension;
  139. byte loadType = binaryReader.ReadByte();
  140. int length = binaryReader.Read7BitEncodedInt32();
  141. int hashCode = binaryReader.ReadInt32();
  142. int compressedLength = binaryReader.Read7BitEncodedInt32();
  143. int compressedHashCode = binaryReader.ReadInt32();
  144. int assetIndexCount = binaryReader.Read7BitEncodedInt32();
  145. int[] assetIndexes = assetIndexCount > 0 ? new int[assetIndexCount] : null;
  146. for (int j = 0; j < assetIndexCount; j++)
  147. {
  148. assetIndexes[j] = binaryReader.Read7BitEncodedInt32();
  149. }
  150. resources[i] = new UpdatableVersionList.Resource(name, variant, extension, loadType, length, hashCode, compressedLength, compressedHashCode, assetIndexes);
  151. }
  152. int resourceGroupCount = binaryReader.Read7BitEncodedInt32();
  153. UpdatableVersionList.ResourceGroup[] resourceGroups = resourceGroupCount > 0 ? new UpdatableVersionList.ResourceGroup[resourceGroupCount] : null;
  154. for (int i = 0; i < resourceGroupCount; i++)
  155. {
  156. string name = binaryReader.ReadEncryptedString(encryptBytes);
  157. int resourceIndexCount = binaryReader.Read7BitEncodedInt32();
  158. int[] resourceIndexes = resourceIndexCount > 0 ? new int[resourceIndexCount] : null;
  159. for (int j = 0; j < resourceIndexCount; j++)
  160. {
  161. resourceIndexes[j] = binaryReader.Read7BitEncodedInt32();
  162. }
  163. resourceGroups[i] = new UpdatableVersionList.ResourceGroup(name, resourceIndexes);
  164. }
  165. return new UpdatableVersionList(applicableGameVersion, internalResourceVersion, assets, resources, null, resourceGroups);
  166. }
  167. }
  168. /// <summary>
  169. /// 反序列化可更新模式版本资源列表(版本 2)回调函数。
  170. /// </summary>
  171. /// <param name="stream">指定流。</param>
  172. /// <returns>反序列化的可更新模式版本资源列表(版本 2)。</returns>
  173. public static UpdatableVersionList UpdatableVersionListDeserializeCallback_V2(Stream stream)
  174. {
  175. using (BinaryReader binaryReader = new BinaryReader(stream, Encoding.UTF8))
  176. {
  177. byte[] encryptBytes = binaryReader.ReadBytes(CachedHashBytesLength);
  178. string applicableGameVersion = binaryReader.ReadEncryptedString(encryptBytes);
  179. int internalResourceVersion = binaryReader.Read7BitEncodedInt32();
  180. int assetCount = binaryReader.Read7BitEncodedInt32();
  181. UpdatableVersionList.Asset[] assets = assetCount > 0 ? new UpdatableVersionList.Asset[assetCount] : null;
  182. for (int i = 0; i < assetCount; i++)
  183. {
  184. string name = binaryReader.ReadEncryptedString(encryptBytes);
  185. int dependencyAssetCount = binaryReader.Read7BitEncodedInt32();
  186. int[] dependencyAssetIndexes = dependencyAssetCount > 0 ? new int[dependencyAssetCount] : null;
  187. for (int j = 0; j < dependencyAssetCount; j++)
  188. {
  189. dependencyAssetIndexes[j] = binaryReader.Read7BitEncodedInt32();
  190. }
  191. assets[i] = new UpdatableVersionList.Asset(name, dependencyAssetIndexes);
  192. }
  193. int resourceCount = binaryReader.Read7BitEncodedInt32();
  194. UpdatableVersionList.Resource[] resources = resourceCount > 0 ? new UpdatableVersionList.Resource[resourceCount] : null;
  195. for (int i = 0; i < resourceCount; i++)
  196. {
  197. string name = binaryReader.ReadEncryptedString(encryptBytes);
  198. string variant = binaryReader.ReadEncryptedString(encryptBytes);
  199. string extension = binaryReader.ReadEncryptedString(encryptBytes) ?? DefaultExtension;
  200. byte loadType = binaryReader.ReadByte();
  201. int length = binaryReader.Read7BitEncodedInt32();
  202. int hashCode = binaryReader.ReadInt32();
  203. int compressedLength = binaryReader.Read7BitEncodedInt32();
  204. int compressedHashCode = binaryReader.ReadInt32();
  205. int assetIndexCount = binaryReader.Read7BitEncodedInt32();
  206. int[] assetIndexes = assetIndexCount > 0 ? new int[assetIndexCount] : null;
  207. for (int j = 0; j < assetIndexCount; j++)
  208. {
  209. assetIndexes[j] = binaryReader.Read7BitEncodedInt32();
  210. }
  211. resources[i] = new UpdatableVersionList.Resource(name, variant, extension, loadType, length, hashCode, compressedLength, compressedHashCode, assetIndexes);
  212. }
  213. int fileSystemCount = binaryReader.Read7BitEncodedInt32();
  214. UpdatableVersionList.FileSystem[] fileSystems = fileSystemCount > 0 ? new UpdatableVersionList.FileSystem[fileSystemCount] : null;
  215. for (int i = 0; i < fileSystemCount; i++)
  216. {
  217. string name = binaryReader.ReadEncryptedString(encryptBytes);
  218. int resourceIndexCount = binaryReader.Read7BitEncodedInt32();
  219. int[] resourceIndexes = resourceIndexCount > 0 ? new int[resourceIndexCount] : null;
  220. for (int j = 0; j < resourceIndexCount; j++)
  221. {
  222. resourceIndexes[j] = binaryReader.Read7BitEncodedInt32();
  223. }
  224. fileSystems[i] = new UpdatableVersionList.FileSystem(name, resourceIndexes);
  225. }
  226. int resourceGroupCount = binaryReader.Read7BitEncodedInt32();
  227. UpdatableVersionList.ResourceGroup[] resourceGroups = resourceGroupCount > 0 ? new UpdatableVersionList.ResourceGroup[resourceGroupCount] : null;
  228. for (int i = 0; i < resourceGroupCount; i++)
  229. {
  230. string name = binaryReader.ReadEncryptedString(encryptBytes);
  231. int resourceIndexCount = binaryReader.Read7BitEncodedInt32();
  232. int[] resourceIndexes = resourceIndexCount > 0 ? new int[resourceIndexCount] : null;
  233. for (int j = 0; j < resourceIndexCount; j++)
  234. {
  235. resourceIndexes[j] = binaryReader.Read7BitEncodedInt32();
  236. }
  237. resourceGroups[i] = new UpdatableVersionList.ResourceGroup(name, resourceIndexes);
  238. }
  239. return new UpdatableVersionList(applicableGameVersion, internalResourceVersion, assets, resources, fileSystems, resourceGroups);
  240. }
  241. }
  242. }
  243. }