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
- Ensure the default SerializerSelector is used (SerializerSelector.Default) or, if using a custom selector, register the SpriteFont serializer explicitly in it.
- Verify the assembly containing the generated SpriteFont serializer (Stride.Graphics / Stride.Assets serializers) is referenced and loaded.
- Check that compiler-generated serializers ran (SerializerAssembly / AssetCompiler output present) and are not stripped by trimming.
- 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
- Use SerializerSelector.Default unless you fully replicate its registrations
- Reference the serializer assemblies and disable trimming for them
- Initialize serializers in dependency order
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
- The order of the Asset.Id property must be lower than the or
- Event handlers can't be added or removed after the serialize
- RoutingSerializer expected in the chain of serializers
- The type of collection does not have a parameterless constru
- The given container does not match the expected type.
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)