/// <summary>
        /// Writes a member.
        /// </summary>
        /// <param name="objectContext"></param>
        /// <param name="member">The member.</param>
        protected virtual void WriteMember(ref ObjectContext objectContext, IMemberDescriptor member)
        {
            // Filter members by mask
            if ((member.Mask & objectContext.SerializerContext.MemberMask) == 0)
            {
                return;
            }

            // Skip any member that we won't serialize
            if (!member.ShouldSerialize(objectContext.Instance))
            {
                return;
            }

            // Emit the key name
            WriteMemberName(ref objectContext, member, member.Name);

            var memberValue = member.Get(objectContext.Instance);
            var memberType  = member.Type;

            // In case of serializing a property/field which is not writeable
            // we need to change the expected type to the actual type of the
            // content value
            if (member.SerializeMemberMode == SerializeMemberMode.Content && !member.HasSet)
            {
                if (memberValue != null)
                {
                    memberType = memberValue.GetType();
                }
            }

            // Write the member value
            WriteMemberValue(ref objectContext, member, memberValue, memberType);
        }
 /// <inheritdoc/>
 public virtual bool ShouldSerialize(IMemberDescriptor member, ref ObjectContext objectContext) => member.ShouldSerialize(objectContext.Instance, objectContext.ParentTypeMemberDescriptor);