{"record":{"id":"b1dd0a6fd6f47bb2","repo":"EllanJiang/GameFramework","slug":"deserialize-updatable-version-list-failure","errorCode":null,"errorMessage":"Deserialize updatable version list failure.","messagePattern":"Deserialize updatable version list failure\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Resource/ResourceManager.ResourceChecker.cs","lineNumber":269,"sourceCode":"                    }\n                }\n            }\n\n            private void OnLoadUpdatableVersionListSuccess(string fileUri, byte[] bytes, float duration, object userData)\n            {\n                if (m_UpdatableVersionListReady)\n                {\n                    throw new GameFrameworkException(\"Updatable version list has been parsed.\");\n                }\n\n                MemoryStream memoryStream = null;\n                try\n                {\n                    memoryStream = new MemoryStream(bytes, false);\n                    UpdatableVersionList versionList = m_ResourceManager.m_UpdatableVersionListSerializer.Deserialize(memoryStream);\n                    if (!versionList.IsValid)\n                    {\n                        throw new GameFrameworkException(\"Deserialize updatable version list failure.\");\n                    }\n\n                    UpdatableVersionList.Asset[] assets = versionList.GetAssets();\n                    UpdatableVersionList.Resource[] resources = versionList.GetResources();\n                    UpdatableVersionList.FileSystem[] fileSystems = versionList.GetFileSystems();\n                    UpdatableVersionList.ResourceGroup[] resourceGroups = versionList.GetResourceGroups();\n                    m_ResourceManager.m_ApplicableGameVersion = versionList.ApplicableGameVersion;\n                    m_ResourceManager.m_InternalResourceVersion = versionList.InternalResourceVersion;\n                    m_ResourceManager.m_AssetInfos = new Dictionary<string, AssetInfo>(assets.Length, StringComparer.Ordinal);\n                    m_ResourceManager.m_ResourceInfos = new Dictionary<ResourceName, ResourceInfo>(resources.Length, new ResourceNameComparer());\n                    m_ResourceManager.m_ReadWriteResourceInfos = new SortedDictionary<ResourceName, ReadWriteResourceInfo>(new ResourceNameComparer());\n                    ResourceGroup defaultResourceGroup = m_ResourceManager.GetOrAddResourceGroup(string.Empty);\n\n                    foreach (UpdatableVersionList.FileSystem fileSystem in fileSystems)\n                    {\n                        int[] resourceIndexes = fileSystem.GetResourceIndexes();\n                        foreach (int resourceIndex in resourceIndexes)\n                        {","sourceCodeStart":251,"sourceCodeEnd":287,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Resource/ResourceManager.ResourceChecker.cs#L251-L287","documentation":"After loading the updatable version list bytes, the framework deserializes them with m_UpdatableVersionListSerializer and validates the result via UpdatableVersionList.IsValid. If IsValid is false the bytes did not deserialize into a meaningful version list, and this GameFrameworkException is thrown (and passed through the catch block, since it is already a GameFrameworkException).","triggerScenarios":"The bytes returned by the ResourceHelper for the remote version list file are not a valid serialized UpdatableVersionList — e.g. an HTML error page, a 404 body, an empty file, or a list produced by an incompatible GameFramework resource build.","commonSituations":"Web server returning an error page for the version list URL instead of the binary file; uploading the wrong or truncated GameFrameworkVersionList file; resource pipeline version mismatch between editor build and runtime; CDN misconfiguration returning redirects/HTML.","solutions":["Verify the remote version list URL serves the actual binary file (check with curl/Postman that the bytes are the version list, not an HTML error page).","Rebuild and re-upload the version list with the GameFramework resource build pipeline matching your runtime framework version.","Check that UpdatableVersionListFileName on the server matches the name the client requests and the file is complete (not truncated by upload).","Confirm your custom VersionListSerializer matches the format used to generate the list."],"exampleFix":"// before: server serves index.html for missing file -> IsValid == false\n\n// after: verify server returns the real file\n// curl -I https://cdn.example.com/GameFrameworkVersion/{version}/GameFrameworkList.dat\n// ensure 200 + correct binary content, then re-run update","handlingStrategy":"validation","validationCode":"// before trusting the remote list, sanity-check the served bytes\nUnityWebRequest req = UnityWebRequest.Get(versionListUrl);\nyield return req.SendWebRequest();\nbool looksValid = req.result == UnityWebRequest.Result.Success\n    && req.downloadHandler.data != null\n    && req.downloadHandler.data.Length > 4\n    && req.downloadHandler.data[0] != (byte)'<'; // reject HTML error pages","typeGuard":null,"tryCatchPattern":"try { m_ResourceComponent.UpdateResourceAsync(); }\ncatch (GameFrameworkException ex) when (ex.Message == \"Deserialize updatable version list failure.\")\n{\n    Debug.LogError(\"Remote version list invalid — verify the server serves the binary list, not an error page.\");\n}","preventionTips":["Verify the CDN returns the binary version list (curl it) after every upload.","Rebuild the version list with the same GameFramework version as the runtime.","Check file size/checksum after upload so truncated files are caught before release."],"tags":["gameframework","resource","version-list","deserialization"],"backgroundTag":"schema-validation-failed","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}