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

  1. Install/register the assembly (plugin/package) containing the referenced type before deserializing
  2. Re-save the data after removing references to the missing type
  3. If the type was renamed, migrate the serialized data or re-register the old type id
  4. 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

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


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)