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
- Regenerate the read-only version list with the framework's ResourceBuilder so its format matches the serializer
- Verify m_ReadOnlyVersionListSerializer matches the format used to build the version list file
- Re-download or restore the corrupted version list file and check its checksum
- 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
- Build the version list with the ResourceBuilder version matching the runtime serializer
- Verify file checksum/size after download before use
- Keep serializer type and build pipeline in sync
- Detect truncated downloads by comparing content length
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
- Deserialize updatable 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/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)