{"record":{"id":"e7541a3b95877991","repo":"stride3d/stride","slug":"cannot-set-member-objectcontext-descriptor-type-name-unknown","errorCode":null,"errorMessage":"Cannot set member [{objectContext.Descriptor?.Type.Name ?? \"(Unknown)\"}.{memberName ?? \"(Unknown)\"}]:\n{ex.Message}","messagePattern":"Cannot set member \\[(.+?)\\.(.+?)\\]:\n(.+?)","errorType":"exception","errorClass":"YamlException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.Yaml/Serialization/Serializers/ObjectSerializer.cs","lineNumber":329,"sourceCode":"            // content value\n            if (memberValue != null)\n                memberType = memberValue.GetType();\n\n            var oldMemberValue = memberValue;\n            memberValue = ReadMemberValue(ref objectContext, memberAccessor, memberValue, memberType);\n\n            // Handle late binding\n            // Value types need to be reassigned even if it was a Content\n            if (memberAccessor.HasSet && (memberAccessor.Mode != DataMemberMode.Content || memberAccessor.Type.IsValueType || memberValue != oldMemberValue))\n            {\n                try\n                {\n                    memberAccessor.Set(objectContext.Instance, memberValue);\n                }\n                catch (Exception ex)\n                {\n                    ex = ex.Unwrap();\n                    throw new YamlException(objectContext.Reader.Parser.Current.Start, objectContext.Reader.Parser.Current.End, $\"Cannot set member [{objectContext.Descriptor?.Type.Name ?? \"(Unknown)\"}.{memberName ?? \"(Unknown)\"}]:\\n{ex.Message}\");\n                }\n            }\n\n            return ReadMemberState.Sucess;\n        }\n\n        protected virtual string ReadMemberName(ref ObjectContext objectContext, string memberName, out bool skipMember)\n        {\n            return objectContext.ObjectSerializerBackend.ReadMemberName(ref objectContext, memberName, out skipMember);\n        }\n\n        protected virtual object ReadMemberValue(ref ObjectContext objectContext, IMemberDescriptor member,\n            object memberValue,\n            Type memberType)\n        {\n            return objectContext.ObjectSerializerBackend.ReadMemberValue(ref objectContext, member, memberValue, memberType);\n        }\n","sourceCodeStart":311,"sourceCodeEnd":347,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.Yaml/Serialization/Serializers/ObjectSerializer.cs#L311-L347","documentation":"After a member value was read, assigning it to the target instance's member (memberAccessor.Set) failed. The original exception is unwrapped and rethrown as a YamlException with the current node's span, prefixed by 'Cannot set member [Type.Member]'.","triggerScenarios":"memberAccessor.Set throwing during TryReadMemberCore — value type conversion produced an incompatible value, setter threw a domain validation exception, set-only/recursive initialization failed, or the member became set-inaccessible.","commonSituations":"Property setters with validation/notifications (INotifyPropertyChanged handlers throwing); assigning a struct with invalid value; cross-version type changes where the deserialized type no longer matches the setter's expectations.","solutions":["Read the inner message after 'Cannot set member' to identify why the setter failed","Fix the YAML value so it is valid for the setter (range/format/type)","Fix or relax the property setter so it accepts deserialized values","Use AllowErrors in SerializerContext to skip members that fail to set"],"exampleFix":"// before\npublic int Health { get => _health; set => _health = value > 100 ? throw new ArgumentException() : value; }\nyaml: health: 150\n// after\npublic int Health { get; set; } // validate elsewhere, or clamp: _health = Math.Min(value, 100)","handlingStrategy":"try-catch","validationCode":"// Pre-check that the setter accepts the value\ntry { memberAccessor.Set(testInstance, candidateValue); }\ncatch (Exception ex) { throw new YamlException($\"Setter rejected value: {ex.Message}\"); }","typeGuard":null,"tryCatchPattern":"try\n{\n    serializer.Deserialize<Model>(reader);\n}\ncatch (YamlException ex) when (ex.Message.StartsWith(\"Cannot set member\"))\n{\n    logger.LogError(ex.InnerException, \"Setter failure: {Msg}\", ex.Message);\n}","preventionTips":["Keep property setters side-effect free and non-throwing during deserialization","Clamp/normalize values in setters instead of throwing","Coordinate type changes with the serialized data format"],"tags":["yaml","deserialization","member-assignment"],"backgroundTag":"yaml-parse-error","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}