コード例 #1
0
        /// <inheritdoc/>
        internal override void OnAddedToContentWriter(ContentWriter output)
        {
            base.OnAddedToContentWriter(output);

            _keyWriter   = output.GetTypeWriter(typeof(K));
            _valueWriter = output.GetTypeWriter(typeof(V));
        }
コード例 #2
0
        /// <inheritdoc/>
        internal override void OnAddedToContentWriter(ContentWriter output)
        {
            base.OnAddedToContentWriter(output);

            foreach (var property in _properties)
            {
                output.GetTypeWriter(property.PropertyType);
            }

            foreach (var field in _fields)
            {
                output.GetTypeWriter(field.FieldType);
            }
        }
コード例 #3
0
        /// <inheritdoc/>
        internal override void OnAddedToContentWriter(ContentWriter output)
        {
            base.OnAddedToContentWriter(output);

            if (TargetType.IsGenericType)
            {
                _genericTypes = new List <ContentTypeWriter>();
                var arguments = TargetType.GetGenericArguments();
                foreach (var arg in arguments)
                {
                    _genericTypes.Add(output.GetTypeWriter(arg));
                }
            }
        }
コード例 #4
0
        protected internal override void Write(ContentWriter output, object value)
        {
            if (_baseType != null)
            {
                var baseTypeWriter = output.GetTypeWriter(_baseType);
                baseTypeWriter.Write(output, value);
            }

            foreach (var property in _properties)
            {
                Write(value, output, property);
            }

            foreach (var field in _fields)
            {
                Write(value, output, field);
            }
        }
コード例 #5
0
        private static void Write(object parent, ContentWriter output, MemberInfo member)
        {
            var property = member as PropertyInfo;
            var field    = member as FieldInfo;

            Debug.Assert(field != null || property != null);

            Type   elementType;
            object memberObject;

            if (property != null)
            {
                elementType  = property.PropertyType;
                memberObject = property.GetValue(parent, null);
            }
            else
            {
                elementType  = field.FieldType;
                memberObject = field.GetValue(parent);
            }

            if (_sharedResources.Contains(member))
            {
                output.WriteSharedResource(memberObject);
            }
            else
            {
                var writer = output.GetTypeWriter(elementType);
                if (writer == null || elementType == typeof(object) || elementType == typeof(Array))
                {
                    output.WriteObject(memberObject);
                }
                else
                {
                    output.WriteObject(memberObject, writer);
                }
            }
        }
コード例 #6
0
ファイル: EnumWriter.cs プロジェクト: chubbyerror/Gibbo2D
        protected internal override void Write(ContentWriter output, T value)
        {
            var typeWriter = output.GetTypeWriter(_underlyingType);

            output.WriteRawObject(Convert.ChangeType(value, _underlyingType), typeWriter);
        }
コード例 #7
0
 /// <inheritdoc/>
 internal override void OnAddedToContentWriter(ContentWriter output)
 {
     base.OnAddedToContentWriter(output);
     _underlyingType       = Enum.GetUnderlyingType(typeof(T));
     _underlyingTypeWriter = output.GetTypeWriter(_underlyingType);
 }
コード例 #8
0
        /// <inheritdoc/>
        internal override void OnAddedToContentWriter(ContentWriter output)
        {
            base.OnAddedToContentWriter(output);

            _elementWriter = output.GetTypeWriter(typeof(T));
        }
コード例 #9
0
        private static void Write(object parent, ContentWriter output, MemberInfo member)
        {
            var property = member as PropertyInfo;
            var field    = member as FieldInfo;

            Debug.Assert(field != null || property != null);

            // Properties must have public get and set
            if (property != null && (property.CanWrite == false || property.CanRead == false))
            {
                return;
            }

            if (property != null && property.Name == "Item")
            {
                var getMethod = ReflectionHelpers.GetPropertyGetMethod(property);
                var setMethod = ReflectionHelpers.GetPropertySetMethod(property);

                if ((getMethod != null && getMethod.GetParameters().Length > 0) ||
                    (setMethod != null && setMethod.GetParameters().Length > 0))
                {
                    // This is presumably a property like this[indexer] and this
                    // should not get involved in the object deserialization.
                    return;
                }
            }

            var attr = ReflectionHelpers.GetCustomAttribute(member, typeof(ContentSerializerIgnoreAttribute));

            if (attr != null)
            {
                return;
            }

            var contentSerializerAttribute = ReflectionHelpers.GetCustomAttribute(member, typeof(ContentSerializerAttribute)) as ContentSerializerAttribute;

            bool isSharedResource = false;

            if (contentSerializerAttribute != null)
            {
                isSharedResource = contentSerializerAttribute.SharedResource;
            }
            else
            {
                if (property != null)
                {
                    if (!ReflectionHelpers.PropertyIsPublic(property))
                    {
                        return;
                    }
                }
                else
                {
                    if (!field.IsPublic)
                    {
                        return;
                    }

                    // evolutional: Added check to skip initialise only fields
                    if (field.IsInitOnly)
                    {
                        return;
                    }
                }
            }

            ContentTypeWriter writer;
            Type   elementType;
            object memberObject;

            if (property != null)
            {
                elementType  = property.PropertyType;
                writer       = output.GetTypeWriter(elementType);
                memberObject = property.GetValue(parent, null);
            }
            else
            {
                elementType  = field.FieldType;
                writer       = output.GetTypeWriter(elementType);
                memberObject = field.GetValue(parent);
            }

            if (!isSharedResource)
            {
                if (writer == null && elementType == typeof(object))
                {
                    // Write elements serialized as "object".
                    output.WriteObject(memberObject);
                }
                else
                {
                    // We can get here and still be NULL, exit gracefully.
                    if (writer == null)
                    {
                        return;
                    }

                    output.WriteObject(memberObject, writer);
                }
            }
            else
            {
                output.WriteSharedResource(memberObject);
            }
        }
コード例 #10
0
        private static void Write(object parent, ContentWriter output, MemberInfo member)
        {
            var property = member as PropertyInfo;
            var field    = member as FieldInfo;

            Debug.Assert(field != null || property != null);

            if (property != null)
            {
                // Properties must have at least a getter.
                if (property.CanRead == false)
                {
                    return;
                }

                // Skip over indexer properties.
                if (property.Name == "Item")
                {
                    var getMethod = ReflectionHelpers.GetPropertyGetMethod(property);
                    var setMethod = ReflectionHelpers.GetPropertySetMethod(property);

                    if ((getMethod != null && getMethod.GetParameters().Length > 0) ||
                        (setMethod != null && setMethod.GetParameters().Length > 0))
                    {
                        return;
                    }
                }
            }

            // Are we explicitly asked to ignore this item?
            if (ReflectionHelpers.GetCustomAttribute <ContentSerializerIgnoreAttribute>(member) != null)
            {
                return;
            }

            var contentSerializerAttribute = ReflectionHelpers.GetCustomAttribute <ContentSerializerAttribute>(member);

            if (contentSerializerAttribute == null)
            {
                if (property != null)
                {
                    // There is no ContentSerializerAttribute, so non-public
                    // properties cannot be serialized.
                    if (!ReflectionHelpers.PropertyIsPublic(property))
                    {
                        return;
                    }

                    // Check the type reader to see if it is safe to
                    // deserialize into the existing type.
                    if (!property.CanWrite && !output.CanDeserializeIntoExistingObject(property.PropertyType))
                    {
                        return;
                    }
                }
                else
                {
                    // There is no ContentSerializerAttribute, so non-public
                    // fields cannot be deserialized.
                    if (!field.IsPublic)
                    {
                        return;
                    }

                    // evolutional: Added check to skip initialise only fields
                    if (field.IsInitOnly)
                    {
                        return;
                    }
                }
            }

            Type   elementType;
            object memberObject;

            if (property != null)
            {
                elementType  = property.PropertyType;
                memberObject = property.GetValue(parent, null);
            }
            else
            {
                elementType  = field.FieldType;
                memberObject = field.GetValue(parent);
            }

            if (contentSerializerAttribute != null && contentSerializerAttribute.SharedResource)
            {
                output.WriteSharedResource(memberObject);
            }
            else
            {
                var writer = output.GetTypeWriter(elementType);
                if (writer == null || elementType == typeof(object) || elementType == typeof(Array))
                {
                    output.WriteObject(memberObject);
                }
                else
                {
                    output.WriteObject(memberObject, writer);
                }
            }
        }