{"record":{"id":"581bd8ab13d2bc0c","repo":"stride3d/stride","slug":"could-not-find-parent-serializer-for-type-stride-graphics-581bd8","errorCode":null,"errorMessage":"Could not find parent serializer for type Stride.Graphics.SpriteFont","messagePattern":"Could not find parent serializer for type Stride\\.Graphics\\.SpriteFont","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Graphics/Font/SignedDistanceFieldSpriteFontSerializer.cs","lineNumber":29,"sourceCode":"{\n    /// <summary>\n    /// Serializer for <see cref=\"SignedDistanceFieldSpriteFont\"/>.\n    /// </summary>\n    internal class SignedDistanceFieldSpriteFontSerializer : DataSerializer<SignedDistanceFieldSpriteFont>, IDataSerializerGenericInstantiation\n    {\n        private DataSerializer<SpriteFont> parentSerializer;\n\n        public override void PreSerialize(ref SignedDistanceFieldSpriteFont texture, ArchiveMode mode, SerializationStream stream)\n        {\n            // Do not create object during pre-serialize (OK because not recursive)\n        }\n\n        public override void Initialize(SerializerSelector serializerSelector)\n        {\n            parentSerializer = SerializerSelector.Default.GetSerializer<SpriteFont>();\n            if (parentSerializer == null)\n            {\n                throw new InvalidOperationException(string.Format(\"Could not find parent serializer for type {0}\", \"Stride.Graphics.SpriteFont\"));\n            }\n        }\n\n        public override void Serialize(ref SignedDistanceFieldSpriteFont font, ArchiveMode mode, SerializationStream stream)\n        {\n            SpriteFont spriteFont = font;\n            parentSerializer.Serialize(ref spriteFont, mode, stream);\n            font = (SignedDistanceFieldSpriteFont)spriteFont;\n\n            if (mode == ArchiveMode.Deserialize)\n            {\n                var services = stream.Context.Tags.Get(ServiceRegistry.ServiceRegistryKey);\n                var fontSystem = services.GetSafeServiceAs<FontSystem>();\n\n                font.CharacterToGlyph = stream.Read<Dictionary<char, Glyph>>();\n                font.StaticTextures = stream.Read<List<Texture>>();\n\n                font.FontSystem = fontSystem;","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Graphics/Font/SignedDistanceFieldSpriteFontSerializer.cs#L11-L47","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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)."],"exampleFix":"// before\nvar selector = new SerializerSelector();\nvar serializer = new SignedDistanceFieldSpriteFontSerializer();\nselector.RegisterSerializer(serializer);\n// after\nvar serializer = new SignedDistanceFieldSpriteFontSerializer();\nSerializerSelector.Default.RegisterSerializer(serializer);\nserializer.Initialize(SerializerSelector.Default);","handlingStrategy":"validation","validationCode":"var parent = SerializerSelector.Default.GetSerializer<SpriteFont>();\nif (parent == null)\n    throw new InvalidOperationException(\"SpriteFont serializer missing from default SerializerSelector\");","typeGuard":"bool SpriteFontSerializerRegistered() => SerializerSelector.Default.GetSerializer<SpriteFont>() != null;","tryCatchPattern":"try { sdfSerializer.Initialize(SerializerSelector.Default); }\ncatch (InvalidOperationException ex) { log.Error(\"SpriteFont parent serializer missing\", ex); }","preventionTips":["Use SerializerSelector.Default unless you fully replicate its registrations","Reference the serializer assemblies and disable trimming for them","Initialize serializers in dependency order"],"tags":["csharp","serialization","stride"],"backgroundTag":"missing-dependency","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}