stride3d/stride · error · ArgumentException
No serializer available for type id
Error message
No serializer available for type id
What it means
During deserialization of a polymorphic reference member, the type id (ObjectId) is read from the stream and looked up in the serializer registry; if no serializer is registered for that type id (and base type), ArgumentException is thrown. This means the serialized data references a concrete type the loading process doesn't know how to construct.
Solutions
- Install/register the assembly (plugin/package) containing the referenced type before deserializing
- Re-save the data after removing references to the missing type
- If the type was renamed, migrate the serialized data or re-register the old type id
- Use the default SerializerSelector if a custom one is excluding the required serializer
Example fix
// before
var scene = Content.Load<Scene>("scene"); // references ModComponent from missing plugin
// after
// install the plugin package containing ModComponent, then:
Serialization.RegisterSerializationAssembly(modAssembly);
var scene = Content.Load<Scene>("scene"); Defensive patterns
Strategy: validation
Validate before calling
// pre-flight: resolve every type id referenced by the data, or ensure plugin assemblies are loaded
foreach (var asm in requiredPluginAssemblies)
if (Assembly.Load(new AssemblyName(asm)) is null)
throw new InvalidOperationException($"Missing plugin assembly '{asm}' required by the data"); Try / catch
try
{
stream.Deserialize(ref obj);
}
catch (ArgumentException ex) when (ex.Message.StartsWith("No serializer available for type id"))
{
logger.Error(ex, "Serialized data references an unknown type id - install the missing plugin/package or re-save without it");
throw;
} Prevention
- Distribute every plugin assembly that can appear inside saved data
- Fail fast at startup by verifying required plugin packages are installed
- When removing a class from your model, migrate old data instead of shipping it broken
- Pin serializer compatibility across save/load version pairs
When it happens
Trigger: Loading data whose embedded ObjectId maps to a type from an assembly not registered for serialization; deserializing assets saved in a project with extra classes/plugins absent at load time; type renamed/moved after save so the ObjectId/serializer mapping is stale; a SerializerSelector profile that filters out the serializer for that id.
Common situations: Sharing scene/asset files between machines where one has a plugin package installed and the other doesn't; loading a game save after removing a modded component class; version upgrades where generated serializer assemblies changed.
Related errors
- No serializer available for type
- Could not find serializer for type
- Unable to find a serializer for
- Unable to find a serializer for
- Could not find serializer for generic dependent type
AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14).
Data as JSON: /api/errors/518023f704248e79.
Report an issue: GitHub.
Appendix: source
Thrown at sources/core/Stride.Core/Serialization/MemberSerializerCore.ttinclude:247
else
{
<# if (supportsReuseReferences) { #>
if (reuseReferences)
{
if (objectReferences.Count != index)
throw new ContentRefOutOfSyncException();
objectReferences.Add(null);
}
<# } #>
<# if (supportsNonSealed) { #>
if (hasTypeInfo)
{
Unsafe.SkipInit(out ObjectId serializationTypeId);
stream.Serialize(ref serializationTypeId);
objectDataSerializer = context.SerializerSelector.GetSerializer(ref serializationTypeId);
if (objectDataSerializer is null)
throw new ArgumentException("No serializer available for type id " + serializationTypeId + " and base type " + <#= typeExpr #>.FullName);
<# if (supportsGenerics) { #>
objCopy = obj;
<# } #>
objectDataSerializer.PreSerialize(ref <#= objCopyExpr #>, mode, stream);
<# if (supportsReuseReferences) { #>
if (reuseReferences)
{
// Register object so that later references to it are working.
objectReferences[index] = <#= objCopyExpr #>;
}
<# } #>
objectDataSerializer.Serialize(ref <#= objCopyExpr #>, mode, stream);
<# if (supportsGenerics) { #>
obj = (T)objCopy;
<# } #>View on GitHub (pinned to 96fad776d2)