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
- 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).
- Rebuild and re-upload the version list with the GameFramework resource build pipeline matching your runtime framework version.
- Check that UpdatableVersionListFileName on the server matches the name the client requests and the file is complete (not truncated by upload).
- 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
- Verify the CDN returns the binary version list (curl it) after every upload.
- Rebuild the version list with the same GameFramework version as the runtime.
- Check file size/checksum after upload so truncated files are caught before release.
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
- Deserialize read-only version list failure.
- Deserialize read-write version list failure.
- Deserialize package version list failure.
- Parse package version list exception
- Parse updatable version list exception
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)