EllanJiang/GameFramework · error · GameFrameworkException

Deserialize updatable version list failure.

Error message

Deserialize updatable version list failure.

What it means

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).

Solutions

  1. 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).
  2. Rebuild and re-upload the version list with the GameFramework resource build pipeline matching your runtime framework version.
  3. Check that UpdatableVersionListFileName on the server matches the name the client requests and the file is complete (not truncated by upload).
  4. Confirm your custom VersionListSerializer matches the format used to generate the list.

Example fix

// before: server serves index.html for missing file -> IsValid == false

// after: verify server returns the real file
// curl -I https://cdn.example.com/GameFrameworkVersion/{version}/GameFrameworkList.dat
// ensure 200 + correct binary content, then re-run update
Defensive patterns

Strategy: validation

Validate before calling

// before trusting the remote list, sanity-check the served bytes
UnityWebRequest req = UnityWebRequest.Get(versionListUrl);
yield return req.SendWebRequest();
bool looksValid = req.result == UnityWebRequest.Result.Success
    && req.downloadHandler.data != null
    && req.downloadHandler.data.Length > 4
    && req.downloadHandler.data[0] != (byte)'<'; // reject HTML error pages

Try / catch

try { m_ResourceComponent.UpdateResourceAsync(); }
catch (GameFrameworkException ex) when (ex.Message == "Deserialize updatable version list failure.")
{
    Debug.LogError("Remote version list invalid — verify the server serves the binary list, not an error page.");
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

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/b1dd0a6fd6f47bb2. Report an issue: GitHub.

Appendix: source

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

                    }
                }
            }

            private void OnLoadUpdatableVersionListSuccess(string fileUri, byte[] bytes, float duration, object userData)
            {
                if (m_UpdatableVersionListReady)
                {
                    throw new GameFrameworkException("Updatable version list has been parsed.");
                }

                MemoryStream memoryStream = null;
                try
                {
                    memoryStream = new MemoryStream(bytes, false);
                    UpdatableVersionList versionList = m_ResourceManager.m_UpdatableVersionListSerializer.Deserialize(memoryStream);
                    if (!versionList.IsValid)
                    {
                        throw new GameFrameworkException("Deserialize updatable version list failure.");
                    }

                    UpdatableVersionList.Asset[] assets = versionList.GetAssets();
                    UpdatableVersionList.Resource[] resources = versionList.GetResources();
                    UpdatableVersionList.FileSystem[] fileSystems = versionList.GetFileSystems();
                    UpdatableVersionList.ResourceGroup[] resourceGroups = versionList.GetResourceGroups();
                    m_ResourceManager.m_ApplicableGameVersion = versionList.ApplicableGameVersion;
                    m_ResourceManager.m_InternalResourceVersion = versionList.InternalResourceVersion;
                    m_ResourceManager.m_AssetInfos = new Dictionary<string, AssetInfo>(assets.Length, StringComparer.Ordinal);
                    m_ResourceManager.m_ResourceInfos = new Dictionary<ResourceName, ResourceInfo>(resources.Length, new ResourceNameComparer());
                    m_ResourceManager.m_ReadWriteResourceInfos = new SortedDictionary<ResourceName, ReadWriteResourceInfo>(new ResourceNameComparer());
                    ResourceGroup defaultResourceGroup = m_ResourceManager.GetOrAddResourceGroup(string.Empty);

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

View on GitHub (pinned to d0c010b051)