EllanJiang/GameFramework · error · GameFrameworkException

Read-write version list has been parsed.

Error message

Read-write version list has been parsed.

What it means

Mirror of the read-only guard for the read-write (sandbox) version list: OnLoadReadWriteVersionListSuccess throws if m_ReadWriteVersionListReady is already true. It prevents double parsing of the read-write version list, which would append duplicate resources to the check state.

Solutions

  1. Guarantee single success callback per read-write version list load
  2. Check that ReadWriteVersionListHelper isn't subscribed multiple times
  3. Reset the checker before re-running checks
  4. Inspect the helper for accidental loops calling the success callback per chunk

Example fix

// before: per-chunk success invocation
foreach (chunk in chunks) onSuccess(allBytes); // fires N times
// after: fire once when fully loaded
onSuccess(assembledBytes); // fires once
Defensive patterns

Strategy: try-catch

Try / catch

try { checker.CheckResources(); }
catch (GameFrameworkException ex) when (ex.Message.Contains("Read-write version list has been parsed")) { Log.Warning("Duplicate read-write version list success event"); }

Prevention

When it happens

Trigger: OnLoadReadWriteVersionListSuccess invoked a second time after the read-write version list was already parsed (m_ReadWriteVersionListReady == true).

Common situations: Duplicate success events from the read-write load helper; starting a second resource check without resetting flags; re-entrant dispatch from a custom load bytes helper.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


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

Appendix: source

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

                }
            }

            private void OnLoadReadOnlyVersionListFailure(string fileUri, string errorMessage, object userData)
            {
                if (m_ReadOnlyVersionListReady)
                {
                    throw new GameFrameworkException("Read-only version list has been parsed.");
                }

                m_ReadOnlyVersionListReady = true;
                RefreshCheckInfoStatus();
            }

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

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

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

                    foreach (LocalVersionList.FileSystem fileSystem in fileSystems)
                    {
                        int[] resourceIndexes = fileSystem.GetResourceIndexes();

View on GitHub (pinned to d0c010b051)