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

  1. Read the inner message after 'Cannot set member' to identify why the setter failed
  2. Fix the YAML value so it is valid for the setter (range/format/type)
  3. Fix or relax the property setter so it accepts deserialized values
  4. 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

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


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)