stride3d/stride · error · InvalidOperationException

Could not find parent serializer for type Stride.Graphics.Sp

Error message

Could not find parent serializer for type Stride.Graphics.SpriteFont

What it means

SignedDistanceFieldSpriteFont's serializer depends on a parent serializer registered for Stride.Graphics.SpriteFont. During Initialize it looks up SerializerSelector.Default.GetSerializer<SpriteFont>(); if the default selector has no serializer for SpriteFont, initialization fails because the SDF font serializer cannot delegate to it. This usually indicates an incomplete or customized serializer registration setup.

Solutions

  1. Ensure the default SerializerSelector is used (SerializerSelector.Default) or, if using a custom selector, register the SpriteFont serializer explicitly in it.
  2. Verify the assembly containing the generated SpriteFont serializer (Stride.Graphics / Stride.Assets serializers) is referenced and loaded.
  3. Check that compiler-generated serializers ran (SerializerAssembly / AssetCompiler output present) and are not stripped by trimming.
  4. Register the SDF font serializer only after serializer registration is complete (order of Initialize calls).

Example fix

// before
var selector = new SerializerSelector();
var serializer = new SignedDistanceFieldSpriteFontSerializer();
selector.RegisterSerializer(serializer);
// after
var serializer = new SignedDistanceFieldSpriteFontSerializer();
SerializerSelector.Default.RegisterSerializer(serializer);
serializer.Initialize(SerializerSelector.Default);
Defensive patterns

Strategy: validation

Validate before calling

var parent = SerializerSelector.Default.GetSerializer<SpriteFont>();
if (parent == null)
    throw new InvalidOperationException("SpriteFont serializer missing from default SerializerSelector");

Type guard

bool SpriteFontSerializerRegistered() => SerializerSelector.Default.GetSerializer<SpriteFont>() != null;

Try / catch

try { sdfSerializer.Initialize(SerializerSelector.Default); }
catch (InvalidOperationException ex) { log.Error("SpriteFont parent serializer missing", ex); }

Prevention

When it happens

Trigger: Calling SerializerSelector.Default.GetSerializer<SpriteFont>() returns null while initializing SignedDistanceFieldSpriteFontSerializer — e.g. when a custom SerializerSelector replaces the default one, or assembly scanning for serializer assembly attributes was skipped/partial (missing Stride.Graphics serializers assembly loaded).

Common situations: Custom serialization pipelines in game editors or build tools that construct SerializerSelector instances manually; stripping assemblies (IL link/AOT trimming) removing the auto-generated SpriteFont serializer; initializing the SDF font serializer before the default serializer registry is populated.

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

Appendix: source

Thrown at sources/engine/Stride.Graphics/Font/SignedDistanceFieldSpriteFontSerializer.cs:29

{
    /// <summary>
    /// Serializer for <see cref="SignedDistanceFieldSpriteFont"/>.
    /// </summary>
    internal class SignedDistanceFieldSpriteFontSerializer : DataSerializer<SignedDistanceFieldSpriteFont>, IDataSerializerGenericInstantiation
    {
        private DataSerializer<SpriteFont> parentSerializer;

        public override void PreSerialize(ref SignedDistanceFieldSpriteFont texture, ArchiveMode mode, SerializationStream stream)
        {
            // Do not create object during pre-serialize (OK because not recursive)
        }

        public override void Initialize(SerializerSelector serializerSelector)
        {
            parentSerializer = SerializerSelector.Default.GetSerializer<SpriteFont>();
            if (parentSerializer == null)
            {
                throw new InvalidOperationException(string.Format("Could not find parent serializer for type {0}", "Stride.Graphics.SpriteFont"));
            }
        }

        public override void Serialize(ref SignedDistanceFieldSpriteFont font, ArchiveMode mode, SerializationStream stream)
        {
            SpriteFont spriteFont = font;
            parentSerializer.Serialize(ref spriteFont, mode, stream);
            font = (SignedDistanceFieldSpriteFont)spriteFont;

            if (mode == ArchiveMode.Deserialize)
            {
                var services = stream.Context.Tags.Get(ServiceRegistry.ServiceRegistryKey);
                var fontSystem = services.GetSafeServiceAs<FontSystem>();

                font.CharacterToGlyph = stream.Read<Dictionary<char, Glyph>>();
                font.StaticTextures = stream.Read<List<Texture>>();

                font.FontSystem = fontSystem;

View on GitHub (pinned to 96fad776d2)