stride3d/stride · error · InvalidOperationException

Unable to find a serializer for

Error message

Unable to find a serializer for [{assetFileExtension}]

What it means

After resolving the asset's default extension from AssetRegistry, Save could not find a serializer registered for that specific extension. The type is registered but the (extension -> serializer) mapping is missing at save time.

Solutions

  1. Register an IAssetSerializer for the exact extension returned by GetDefaultExtension (including leading dot/casing)
  2. Ensure serializer registration code runs before the first Save call
  3. Compare the extension string used in both registrations for exact match (ToLowerInvariant applies on load path only)
  4. Check that the serializer assembly is referenced and initialized in this process

Example fix

// before
// extension registered, but no serializer for '.myasset'
AssetFileSerializer.Save(stream, myAsset);
// after
SerializerRegistry.Register(new MyAssetSerializer("myasset")); // must match '.myasset'
AssetFileSerializer.Save(stream, myAsset);
Defensive patterns

Strategy: validation

Validate before calling

var ext = AssetRegistry.GetDefaultExtension(asset.GetType());
if (ext != null && AssetFileSerializer.FindSerializer(ext) == null)
    throw new InvalidOperationException($"No serializer registered for '{ext}'");

Try / catch

try { AssetFileSerializer.Save(stream, asset, yamlMetadata, log); }
catch (InvalidOperationException ex) when (ex.Message.StartsWith("Unable to find a serializer"))
{ log.Error($"Serializer missing for extension of {asset.GetType()}"); }

Prevention

When it happens

Trigger: Calling AssetFileSerializer.Save where AssetRegistry.GetDefaultExtension(type) returns an extension (e.g. from a stale/duplicate registration) but no IAssetSerializer was registered for that extension string; registration order issues where serializers are registered after save runs.

Common situations: Custom asset pipeline where extension registration and serializer registration got out of sync; serializers assembly not loaded; casing/leading-dot mismatch between registered extension and serializer keys.

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/7b864e1d99ad5661. Report an issue: GitHub.

Appendix: source

Thrown at sources/assets/Stride.Core.Assets/AssetFileSerializer.cs:152

    /// </summary>
    /// <param name="stream">The stream.</param>
    /// <param name="asset">The asset object.</param>
    /// <param name="yamlMetadata"></param>
    /// <param name="log">The logger.</param>
    /// <exception cref="System.ArgumentNullException">
    /// stream
    /// or
    /// assetFileExtension
    /// </exception>
    public static void Save(Stream stream, object asset, AttachedYamlAssetMetadata? yamlMetadata, ILogger? log = null, string? assetNamespace = null)
    {
        ArgumentNullException.ThrowIfNull(stream);
        if (asset == null) return;

        var assetFileExtension = AssetRegistry.GetDefaultExtension(asset.GetType())
            ?? throw new ArgumentException("Unable to find a serializer for the specified asset. No asset file extension registered to AssetRegistry");
        var serializer = FindSerializer(assetFileExtension)
            ?? throw new InvalidOperationException($"Unable to find a serializer for [{assetFileExtension}]");
        serializer.Save(stream, asset, yamlMetadata, log, assetNamespace);
    }
}

View on GitHub (pinned to 96fad776d2)