{"record":{"id":"637e6ea66b1c8200","repo":"EllanJiang/GameFramework","slug":"updatable-version-list-0-is-invalid-error-message-is-1","errorCode":null,"errorMessage":"Updatable version list '{0}' is invalid, error message is '{1}'.","messagePattern":"Updatable version list '(.+?)' is invalid, error message is '(.+?)'\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Resource/ResourceManager.ResourceChecker.cs","lineNumber":365,"sourceCode":"                    {\n                        throw;\n                    }\n\n                    throw new GameFrameworkException(Utility.Text.Format(\"Parse updatable version list exception '{0}'.\", exception), exception);\n                }\n                finally\n                {\n                    if (memoryStream != null)\n                    {\n                        memoryStream.Dispose();\n                        memoryStream = null;\n                    }\n                }\n            }\n\n            private void OnLoadUpdatableVersionListFailure(string fileUri, string errorMessage, object userData)\n            {\n                throw new GameFrameworkException(Utility.Text.Format(\"Updatable version list '{0}' is invalid, error message is '{1}'.\", fileUri, string.IsNullOrEmpty(errorMessage) ? \"<Empty>\" : errorMessage));\n            }\n\n            private void OnLoadReadOnlyVersionListSuccess(string fileUri, byte[] bytes, float duration, object userData)\n            {\n                if (m_ReadOnlyVersionListReady)\n                {\n                    throw new GameFrameworkException(\"Read-only version list has been parsed.\");\n                }\n\n                MemoryStream memoryStream = null;\n                try\n                {\n                    memoryStream = new MemoryStream(bytes, false);\n                    LocalVersionList versionList = m_ResourceManager.m_ReadOnlyVersionListSerializer.Deserialize(memoryStream);\n                    if (!versionList.IsValid)\n                    {\n                        throw new GameFrameworkException(\"Deserialize read-only version list failure.\");\n                    }","sourceCodeStart":347,"sourceCodeEnd":383,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Resource/ResourceManager.ResourceChecker.cs#L347-L383","documentation":"When the ResourceHelper fails to load the remote (updatable) version list bytes, OnLoadUpdatableVersionListFailure converts that load failure into a GameFrameworkException naming the requested fileUri and the helper's error message (or '<Empty>' if none). Unlike the read-only/read-write list handlers, a failed remote list load is fatal — the update cannot proceed without it.","triggerScenarios":"The ResourceHelper's LoadBytes fails for the remote version list file at Path.Combine(ReadWritePath or remote URL, 'GameFrameworkList.dat') — missing file, unreachable server, network timeout, permission error on ReadWritePath.","commonSituations":"First launch before any update where the remote URL is wrong or CDN is down; device offline or on a captive portal; the version list was deleted/misnamed on the server; version list expected locally in ReadWritePath but never downloaded yet.","solutions":["Check the fileUri in the message: verify the remote version list exists at that exact URL/path (fix server file name/version directory).","Test network connectivity and retry the update when the device is online.","Inspect errorMessage (or <Empty>) from your DefaultResourceHelper log to see the underlying cause (404, DNS, timeout).","Implement retry logic around UpdateResourceAsync for transient network failures."],"exampleFix":"// before\nm_ResourceComponent.UpdateResourceAsync(); // no retry on flaky network\n\n// after\nIEnumerator UpdateWithRetry(int maxRetries = 3)\n{\n    for (int i = 0; i < maxRetries; i++)\n    {\n        bool failed = false;\n        // hook ResourceUpdateFailure / failure log to set failed=true\n        m_ResourceComponent.UpdateResourceAsync();\n        yield return new WaitUntil(() => done || (failed = FailureReported));\n        if (!failed) yield break;\n        yield return new WaitForSeconds(2f * (i + 1));\n    }\n}","handlingStrategy":"retry","validationCode":"UnityWebRequest head = UnityWebRequest.Head(versionListUrl);\nyield return head.SendWebRequest();\nbool reachable = head.result == UnityWebRequest.Result.Success\n    && (long)head.responseCode == 200;","typeGuard":null,"tryCatchPattern":"try { m_ResourceComponent.UpdateResourceAsync(); }\ncatch (GameFrameworkException ex) when (ex.Message.StartsWith(\"Updatable version list\"))\n{\n    Debug.LogError($\"Remote version list load failed: {ex.Message}\");\n    // schedule a retry with backoff, or fall back to bundled resources\n}","preventionTips":["Probe the version list URL (HEAD request) before starting the update.","Implement exponential-backoff retries for transient network failures.","Confirm the exact file name/version directory on the CDN matches what the client requests.","Keep a fallback path that lets the game run with bundled resources when the remote list is unreachable."],"tags":["gameframework","resource","version-list","network","load-failure"],"backgroundTag":"http-request-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"}