EllanJiang/GameFramework · error · GameFrameworkException

Deserialize read-only version list failure.

Error message

Deserialize read-only version list failure.

What it means

Thrown when the read-only version list bytes were loaded but the configured version list serializer either failed to produce a valid list or returned a list whose IsValid is false. GameFramework refuses to proceed with resource checking using a corrupt or unrecognized version list.

Solutions

  1. Regenerate the read-only version list with the framework's ResourceBuilder so its format matches the serializer
  2. Verify m_ReadOnlyVersionListSerializer matches the format used to build the version list file
  3. Re-download or restore the corrupted version list file and check its checksum
  4. Confirm the correct file path/URI is being loaded (not another resource)

Example fix

// before: mismatched serializer
resourceManager.ReadOnlyVersionListSerializer = new PackageVersionListSerializer();
// after: use the serializer matching the built list
resourceManager.ReadOnlyVersionListSerializer = new LocalVersionListSerializer();
Defensive patterns

Strategy: validation

Validate before calling

// validate version list file before handing it to the framework
if (!File.Exists(versionListPath) || new FileInfo(versionListPath).Length == 0)
    throw new FileNotFoundException("Version list missing or empty", versionListPath);
// optionally verify checksum against expected

Try / catch

try { checker.CheckResources(); }
catch (GameFrameworkException ex) when (ex.Message.Contains("Deserialize read-only version list failure")) { RegenerateVersionList(); }

Prevention

When it happens

Trigger: m_ResourceManager.m_ReadOnlyVersionListSerializer.Deserialize(memoryStream) returns null/invalid data, or the deserialized LocalVersionList reports IsValid == false — e.g. bytes from a corrupted or wrong-format version list file.

Common situations: Version list file generated by a different game framework version or serializer; truncated/partial download of the version list; wrong file passed to the pipeline (e.g. a package file instead of the version list); serializer type mismatched with how the list was serialized.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


AI-assisted analysis of EllanJiang/GameFramework@d0c010b051 (2026-09-15). Data as JSON: /api/errors/9b49648f11d12362. Report an issue: GitHub.

Appendix: source

Thrown at GameFramework/Resource/ResourceManager.ResourceChecker.cs:382

            {
                throw new GameFrameworkException(Utility.Text.Format("Updatable version list '{0}' is invalid, error message is '{1}'.", fileUri, string.IsNullOrEmpty(errorMessage) ? "<Empty>" : errorMessage));
            }

            private void OnLoadReadOnlyVersionListSuccess(string fileUri, byte[] bytes, float duration, object userData)
            {
                if (m_ReadOnlyVersionListReady)
                {
                    throw new GameFrameworkException("Read-only version list has been parsed.");
                }

                MemoryStream memoryStream = null;
                try
                {
                    memoryStream = new MemoryStream(bytes, false);
                    LocalVersionList versionList = m_ResourceManager.m_ReadOnlyVersionListSerializer.Deserialize(memoryStream);
                    if (!versionList.IsValid)
                    {
                        throw new GameFrameworkException("Deserialize read-only version list failure.");
                    }

                    LocalVersionList.Resource[] resources = versionList.GetResources();
                    LocalVersionList.FileSystem[] fileSystems = versionList.GetFileSystems();

                    foreach (LocalVersionList.FileSystem fileSystem in fileSystems)
                    {
                        int[] resourceIndexes = fileSystem.GetResourceIndexes();
                        foreach (int resourceIndex in resourceIndexes)
                        {
                            LocalVersionList.Resource resource = resources[resourceIndex];
                            SetCachedFileSystemName(new ResourceName(resource.Name, resource.Variant, resource.Extension), fileSystem.Name);
                        }
                    }

                    foreach (LocalVersionList.Resource resource in resources)
                    {
                        SetReadOnlyInfo(new ResourceName(resource.Name, resource.Variant, resource.Extension), (LoadType)resource.LoadType, resource.Length, resource.HashCode);

View on GitHub (pinned to d0c010b051)