{"record":{"id":"0dcd5b4be3c118f5","repo":"EllanJiang/GameFramework","slug":"deserialize-package-version-list-failure","errorCode":null,"errorMessage":"Deserialize package version list failure.","messagePattern":"Deserialize package version list failure\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"critical","filePath":"GameFramework/Resource/ResourceManager.ResourceIniter.cs","lineNumber":76,"sourceCode":"\n                if (string.IsNullOrEmpty(m_ResourceManager.m_ReadOnlyPath))\n                {\n                    throw new GameFrameworkException(\"Read-only path is invalid.\");\n                }\n\n                m_ResourceManager.m_ResourceHelper.LoadBytes(Utility.Path.GetRemotePath(Path.Combine(m_ResourceManager.m_ReadOnlyPath, RemoteVersionListFileName)), new LoadBytesCallbacks(OnLoadPackageVersionListSuccess, OnLoadPackageVersionListFailure), null);\n            }\n\n            private void OnLoadPackageVersionListSuccess(string fileUri, byte[] bytes, float duration, object userData)\n            {\n                MemoryStream memoryStream = null;\n                try\n                {\n                    memoryStream = new MemoryStream(bytes, false);\n                    PackageVersionList versionList = m_ResourceManager.m_PackageVersionListSerializer.Deserialize(memoryStream);\n                    if (!versionList.IsValid)\n                    {\n                        throw new GameFrameworkException(\"Deserialize package version list failure.\");\n                    }\n\n                    PackageVersionList.Asset[] assets = versionList.GetAssets();\n                    PackageVersionList.Resource[] resources = versionList.GetResources();\n                    PackageVersionList.FileSystem[] fileSystems = versionList.GetFileSystems();\n                    PackageVersionList.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                    ResourceGroup defaultResourceGroup = m_ResourceManager.GetOrAddResourceGroup(string.Empty);\n\n                    foreach (PackageVersionList.FileSystem fileSystem in fileSystems)\n                    {\n                        int[] resourceIndexes = fileSystem.GetResourceIndexes();\n                        foreach (int resourceIndex in resourceIndexes)\n                        {\n                            PackageVersionList.Resource resource = resources[resourceIndex];","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Resource/ResourceManager.ResourceIniter.cs#L58-L94","documentation":"Thrown in OnLoadPackageVersionListSuccess after the version list bytes were loaded successfully, when the deserialized PackageVersionList fails its IsValid check. It means the data was readable but structurally wrong or from an incompatible version-list format. The library treats this as a fatal resource-system initialization error.","triggerScenarios":"ResourceManager.InitResources loads the package version list, m_PackageVersionListSerializer.Deserialize succeeds but returns a PackageVersionList whose IsValid property is false (wrong magic/version header, empty data, or corrupted serialization).","commonSituations":"Using a version list built by a different GameFramework version or built for editable-mode instead of package mode; the build pipeline produced an empty/corrupt PackageVersionList file; wrong serializer registered for the version list format.","solutions":["Rebuild the package version list with the matching GameFramework ResourceEditor/builder version and redeploy.","Verify the serializer set on ResourceManager (e.g. PackageVersionListSerializer) matches the format of the deployed version list file.","Check that the file at ReadOnlyPath/RemoteVersionListFileName is the package version list (not the remote/updatable variant) and is not truncated."],"exampleFix":"// before\nresourceComponent.m_ResourceManager.m_PackageVersionListSerializer = new PackageVersionListSerializer_V0(); // old format\n// after\nresourceComponent.m_ResourceManager.m_PackageVersionListSerializer = new PackageVersionListSerializer(); // matches builder output","handlingStrategy":"try-catch","validationCode":"// No pre-call API; validate after load: keep a copy of version list bytes and verify length > 0 and built with the current builder version.","typeGuard":null,"tryCatchPattern":"try { resourceComponent.InitResources(); }\ncatch (GameFrameworkException ex) { Log.Fatal(\"Version list invalid: {0}\", ex); /* fallback to rebuild/re-download */ }","preventionTips":["Rebuild the version list whenever upgrading GameFramework.","Use the matching serializer for the deployed list format.","Add a build-time checksum of the version list file."],"tags":["resource","deserialization","version-list","gameframework"],"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"}