stride3d/stride · error · InvalidOperationException

Could not find a serializer for type

Error message

Could not find a serializer for type {typeof(T)}

What it means

DataContentSerializer<T>.Serialize looks up a DataSerializer for type T. When none is registered and DataSerializerFactory.GetSerializer cannot resolve a default serializer type for T, the library throws because it cannot know how to write T to the stream.

Solutions

  1. Register a DataSerializer for T with the serialization system (or add [DataSerializer] and let the source generator produce one)
  2. Implement a custom DataSerializer<T> and register it via DataSerializerFactory / serializer registration
  3. Change the asset field to a serializable type that has a registered serializer

Example fix

// before
public class MyData { public int X; } // no serializer
// after
[DataSerializerGlobal]
public class MyDataSerializer : DataSerializer<MyData>
{
    public override void Serialize(ref MyData obj, ArchiveMode mode, SerializationStream stream)
        => stream.Serialize(ref obj.X);
}
Defensive patterns

Strategy: validation

Validate before calling

var hasSerializer = DataSerializerFactory.GetSerializer("Default", typeof(T)).SerializerType != null;
if (!hasSerializer) throw new InvalidOperationException($"No DataSerializer registered for {typeof(T)}");

Try / catch

try { contentManager.Save(url, asset); }
catch (InvalidOperationException ex) when (ex.Message.Contains("Could not find a serializer")) { // register serializer or fix type
}

Prevention

When it happens

Trigger: Serializing a type T that has no registered DataSerializer and no generated/default serializer (e.g. a custom class without [DataSerializer] or serializer registration) via ContentManager.Save or a serialization stream.

Common situations: Adding a new custom type to an asset without registering a DataSerializer; renaming/moving a type so the generated serializer no longer matches; serializing types not intended to be persisted (e.g. runtime-only services).

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14). Data as JSON: /api/errors/a2152edcbc7845ff. Report an issue: GitHub.

Appendix: source

Thrown at sources/core/Stride.Core.Serialization/Serialization/Contents/DataContentSerializer.cs:36

    {
        dataSerializerHelper.Serialize(context, stream, obj);
    }
}

public class DataContentSerializerHelper<T>
{
    private DataSerializer<T>? dataSerializer;

    public void Serialize(ContentSerializerContext context, SerializationStream stream, T obj)
    {
        // Get serializer
        // Note: Currently registered serializer is the content reference one
        // However, we would like to serialize the actual type here
        if (dataSerializer == null)
        {
            var dataSerializerType = DataSerializerFactory.GetSerializer("Default", typeof(T)).SerializerType;
            if (dataSerializerType == null)
                throw new InvalidOperationException($"Could not find a serializer for type {typeof(T)}");
            dataSerializer = (DataSerializer<T>)Activator.CreateInstance(dataSerializerType)!;
            dataSerializer.Initialize(stream.Context.SerializerSelector);
        }

        // Serialize object
        stream.SerializeExtended(ref obj, context.Mode, dataSerializer);
    }
}

View on GitHub (pinned to 96fad776d2)