{"record":{"id":"806b09cb2ae43cc4","repo":"stride3d/stride","slug":"could-not-determine-data-type-for-0","errorCode":null,"errorMessage":"Could not determine data type for {0}.","messagePattern":"Could not determine data type for (.+?)\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.AssemblyProcessor/Serializers/ReferencedAssemblySerializerProcessor.cs","lineNumber":120,"sourceCode":"        // Find \"DataSerializer<T>\" base and its dataType (T)\n        TypeReference dataType = null;\n        var dataSerializerTypeCurrent = dataSerializerType;\n        while (dataSerializerTypeCurrent != null)\n        {\n            if (dataSerializerTypeCurrent is GenericInstanceType genericInstanceType)\n            {\n                if (genericInstanceType.ElementType.FullName == \"Stride.Core.Serialization.DataSerializer`1\")\n                {\n                    dataType = genericInstanceType.GenericArguments[0];\n                    break;\n                }\n            }\n\n            dataSerializerTypeCurrent = ResolveGenericsVisitor.Process(dataSerializerTypeCurrent, dataSerializerTypeCurrent.Resolve().BaseType);\n        }\n\n        if (dataType == null)\n            throw new InvalidOperationException(string.Format(\"Could not determine data type for {0}.\", dataSerializerType));\n        return dataType;\n    }\n}\n","sourceCodeStart":102,"sourceCodeEnd":124,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.AssemblyProcessor/Serializers/ReferencedAssemblySerializerProcessor.cs#L102-L124","documentation":"FindSerializerDataType walks the serializer's base types (via ResolveGenericsVisitor) to determine which data type the serializer serializes. If after walking all base types no data type was found, it throws this error instead of returning null.","triggerScenarios":"A DataSerializer subclass whose base-type chain never reaches a closed DataSerializer<T> (e.g. serializer derives from an abstract/open intermediate class without closing the generic, or derives from the wrong base).","commonSituations":"Hand-written serializer inheriting from a custom intermediate base class; copy-pasted serializer missing the DataSerializer<T> base; generic arity mismatch while resolving base types.","solutions":["Make the serializer inherit directly (or transitively with closed generics) from DataSerializer<YourType>","Check the base-type chain and close all generic parameters along it","Specify the data type explicitly where the API allows instead of relying on deduction"],"exampleFix":"// before\nclass MySerializer : SerializerBase { } // wrong base\n// after\nclass MySerializer : DataSerializer<MyType> { }","handlingStrategy":"type-guard","validationCode":"static bool HasDataSerializerBase(Type t)\n{\n    for (var b = t.BaseType; b != null; b = b.BaseType)\n        if (b.IsGenericType && b.GetGenericTypeDefinition() == typeof(DataSerializer<>) && !b.ContainsGenericParameters)\n            return true;\n    return false;\n}","typeGuard":"static bool IsWellFormedSerializer(Type t) =>\n    typeof(DataSerializer).IsAssignableFrom(t) && HasDataSerializerBase(t);","tryCatchPattern":"try { RegisterSerializer(serializerType); }\ncatch (InvalidOperationException ex) when (ex.Message.StartsWith(\"Could not determine data type\"))\n{\n    logger.Error($\"{serializerType} must (transitively) derive from a closed DataSerializer<T>\");\n}","preventionTips":["Derive serializers directly from DataSerializer<YourType>","Close every generic parameter along the base-type chain","Avoid custom intermediate serializer base classes without closed generics"],"tags":["serialization","type-inference","inheritance"],"backgroundTag":"type-mismatch","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"}