EllanJiang/GameFramework · error · GameFrameworkException
Updatable version list has been parsed.
Error message
Updatable version list has been parsed.
What it means
OnLoadUpdatableVersionListSuccess guards against parsing the remote (updatable) version list twice: if m_UpdatableVersionListReady is already true when the load-success callback fires, it throws this GameFrameworkException. This protects the check pipeline from duplicate callbacks (e.g. CheckResources called twice while a load is still pending).
Solutions
- Guard your UI/logic so CheckResources is only called once per session (disable the button while updating).
- Track an isChecking flag and skip subsequent CheckResources calls until ResourceCheckComplete fires.
- Fix a custom ResourceHelper that fires the success callback more than once.
Example fix
// before
public void OnUpdateButtonClicked() { m_ResourceComponent.CheckResources(); } // can double-fire
// after
private bool m_Checking;
public void OnUpdateButtonClicked()
{
if (m_Checking) return;
m_Checking = true;
m_ResourceComponent.CheckResources();
} Defensive patterns
Strategy: type-guard
Validate before calling
private bool m_CheckInProgress;
void SafeCheck()
{
if (m_CheckInProgress) return;
m_CheckInProgress = true;
m_ResourceComponent.ResourceCheckComplete += (…) => m_CheckInProgress = false;
m_ResourceComponent.CheckResources();
} Type guard
bool CanStartResourceCheck => !m_CheckInProgress;
Try / catch
try { m_ResourceComponent.CheckResources(); }
catch (GameFrameworkException ex) when (ex.Message.Contains("has been parsed"))
{
Debug.LogWarning("Resource check already running; ignoring duplicate call.");
} Prevention
- Debounce the update button and guard with an is-checking flag.
- Ensure only one code path ever calls CheckResources per session.
- If using a custom ResourceHelper, guarantee each LoadBytes completes exactly one callback.
When it happens
Trigger: Calling CheckResources twice in quick succession so the first parse completes (sets m_UpdatableVersionListReady=true) and a second LoadBytes callback for the same list arrives afterwards.
Common situations: UI double-click triggering resource update twice; two scripts both calling CheckResources on startup; a custom ResourceHelper that invokes both success callbacks or re-invokes the same one.
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
- Read-only version list has been parsed.
- Read-write version list has been parsed.
- Can not attach entity when child entity status is
- Can not attach entity when parent entity status is
- Resource helper is invalid.
AI-assisted analysis of EllanJiang/GameFramework@d0c010b051 (2026-09-15).
Data as JSON: /api/errors/660d815d2e817f6f.
Report an issue: GitHub.
Appendix: source
Thrown at GameFramework/Resource/ResourceManager.ResourceChecker.cs:259
m_ResourceManager.m_FileSystemManager.DestroyFileSystem(fileSystem.Value, true);
removedFileSystemNames.Add(fileSystem.Key);
}
}
if (removedFileSystemNames != null)
{
foreach (string removedFileSystemName in removedFileSystemNames)
{
m_ResourceManager.m_ReadWriteFileSystems.Remove(removedFileSystemName);
}
}
}
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;View on GitHub (pinned to d0c010b051)