Example #1
0
        public override void Serialize(Stream stream, Type type, object value)
        {
            var members = GetMembers(type);

            for (int i = 0; i < members.Length; i++)
            {
                var member = X20Member.WrapMember(members[i], value);
                ctx.Serializer.Serialize_Main(stream, member.Type, member.Value);
            }
        }
Example #2
0
        public override void Deserialize(Stream stream, Type type, ref object value)
        {
            var members = GetMembers(type);

            for (int i = 0; i < members.Length; i++)
            {
                var member      = X20Member.WrapMember(members[i], value);
                var memberValue = member.Value;
                ctx.Serializer.Deserialize_Main(stream, member.Type, ref memberValue);
                member.Value = memberValue;
                value        = member.Target; // this bit is needed for structs!
            }
        }
        /// <summary>
        /// Returns false if the field was constant (literal) while setting 'result' to null.
        /// Otherwise true while setting result to a new RuntimeMember wrapping the specified field
        /// using the appropriate method of building the [s|g]etters (delegates in case of editor/standalone, reflection otherwise)
        /// </summary>
        public static bool TryWrapField(FieldInfo field, object target, out X20Member result)
        {
            if (field.IsLiteral)
            {
                result = null;
                return(false);
            }

            result = new X20Member(field, field.FieldType, target);

#if FAST_REFLECTION
            result._setter = field.DelegateForSet();
            result._getter = field.DelegateForGet();
#else
            result._setter = field.SetValue;
            result._getter = field.GetValue;
#endif
            return(true);
        }
        /// <summary>
        /// Returns false if the property isn't readable or if it's an indexer, setting 'result' to null in the process.
        /// Otherwise true while setting result to a new RuntimeMember wrapping the specified property
        /// using the appropriate method of building the [s|g]etters (delegates in case of editor/standalone, reflection otherwise)
        /// Note that readonly properties (getter only) are fine, as the setter will just be an empty delegate doing nothing.
        /// </summary>
        public static bool TryWrapProperty(PropertyInfo property, object target, out X20Member result)
        {
            if (!property.CanRead || property.IsIndexer())
            {
                result = null;
                return(false);
            }

            result = new X20Member(property, property.PropertyType, target);

            if (property.CanWrite)
            {
#if FAST_REFLECTION
                result._setter = property.DelegateForSet();
#else
                result._setter = (x, y) => property.SetValue(x, y, null);
#endif
            }
#if FAST_REFLECTION
            else
            {
                result._setter = delegate(ref object obj, object value) { }
            };