stride3d/stride · error · YamlException
Cannot set member [ . ]
Error message
Cannot set member [{objectContext.Descriptor?.Type.Name ?? "(Unknown)"}.{memberName ?? "(Unknown)"}]:
{ex.Message} What it means
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]'.
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
Example fix
// before
public int Health { get => _health; set => _health = value > 100 ? throw new ArgumentException() : value; }
yaml: health: 150
// after
public int Health { get; set; } // validate elsewhere, or clamp: _health = Math.Min(value, 100) Defensive patterns
Strategy: try-catch
Validate before calling
// Pre-check that the setter accepts the value
try { memberAccessor.Set(testInstance, candidateValue); }
catch (Exception ex) { throw new YamlException($"Setter rejected value: {ex.Message}"); } Try / catch
try
{
serializer.Deserialize<Model>(reader);
}
catch (YamlException ex) when (ex.Message.StartsWith("Cannot set member"))
{
logger.LogError(ex.InnerException, "Setter failure: {Msg}", ex.Message);
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Cannot add item with key
- Cannot deserialize collection to readonly collection type
- Cannot deserialize collection to type
- Cannot instantiate an object for type
- ex.Message
AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14).
Data as JSON: /api/errors/e7541a3b95877991.
Report an issue: GitHub.
Appendix: source
Thrown at sources/core/Stride.Core.Yaml/Serialization/Serializers/ObjectSerializer.cs:329
// content value
if (memberValue != null)
memberType = memberValue.GetType();
var oldMemberValue = memberValue;
memberValue = ReadMemberValue(ref objectContext, memberAccessor, memberValue, memberType);
// Handle late binding
// Value types need to be reassigned even if it was a Content
if (memberAccessor.HasSet && (memberAccessor.Mode != DataMemberMode.Content || memberAccessor.Type.IsValueType || memberValue != oldMemberValue))
{
try
{
memberAccessor.Set(objectContext.Instance, memberValue);
}
catch (Exception ex)
{
ex = ex.Unwrap();
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}");
}
}
return ReadMemberState.Sucess;
}
protected virtual string ReadMemberName(ref ObjectContext objectContext, string memberName, out bool skipMember)
{
return objectContext.ObjectSerializerBackend.ReadMemberName(ref objectContext, memberName, out skipMember);
}
protected virtual object ReadMemberValue(ref ObjectContext objectContext, IMemberDescriptor member,
object memberValue,
Type memberType)
{
return objectContext.ObjectSerializerBackend.ReadMemberValue(ref objectContext, member, memberValue, memberType);
}
View on GitHub (pinned to 96fad776d2)