protected Type GetEntityTypeForElement(PropertyDescriptor propDesc, XmlReader reader, XmlSerializerContext context)
        {
            Type type = context.GetTypeFromAttribute(reader);

            //obtengo el type de la propiedad...con esto se registra el alias
            TypeDescriptor desc = context.GetTypeDescriptor(propDesc.Metadata.PropertyType);

            //busco por la propiedad
            if (type == null)
            {
                type = propDesc.GetTypeFromElementName(reader.LocalName, context);
            }

            //busco por el alias...
            if (type == null)
            {
                if (context.Settings.IgnoreUnknowTypes)
                {
                    return(null);
                }
                else
                {
                    type = propDesc.Metadata.PropertyType;
                }
            }

            return(type);
        }
        public override string GetElementNameForType(Type entityType, XmlSerializerContext context, bool isNullReturnDefault)
        {
            if (this.Metadata.TypeToElementMap.ContainsKey(entityType))
            {
                return(this.Metadata.TypeToElementMap[entityType]);
            }

            //obtengo el alias
            if (this.UseAlias)
            {
                string alias = context.GetAlias(entityType);
                if (!string.IsNullOrEmpty(alias))
                {
                    return(alias);
                }
            }

            //tengo que buscar los elementos registrados....
            if (!string.IsNullOrEmpty(this.Metadata.DefaultElementName))
            {
                return(this.Metadata.DefaultElementName);
            }

            //devuelvo el root del elemento
            TypeDescriptor itemTypeDesc = context.GetTypeDescriptor(entityType);

            return(itemTypeDesc.GetRootName());
        }
Example #3
0
        protected override void DoToXml(object parent, PropertyDescriptor metadata, object entity, XmlTextWriter writer, XmlSerializerContext context)
        {
            Type           entityType           = entity.GetType();
            TypeDescriptor entityTypeDescriptor = context.GetTypeDescriptor(entityType);

            //no es serializable...
            if (entityTypeDescriptor == null)
            {
                return;
            }

            ObjectPropertyDescriptor descriptor = metadata.GetPropertyDescriptor <ObjectPropertyDescriptor>(entityType, context);

            string elementName = metadata.GetElementNameForType(entityType, context, true);

            //escribo el nombre de la propiedad
            writer.WriteStartElement(elementName);

            if (!context.Settings.UniqueSerializationForInstance || !context.Stack.ContainsInstance(entity))
            {
                //agrego la lista a las entidades registradas
                long id = context.Stack.AddInstance(entity);

                //escribo las propiedades que son atributos
                this.WriteProperties(metadata, entity, entityTypeDescriptor, writer, context, true);

                //agrego el tipo de la entidad como ultimo atributo
                base.WriteTypeDefinition(descriptor, entityType, context, writer);

                //escribo el id del objeto
                if (context.Settings.UniqueSerializationForInstance)
                {
                    writer.WriteAttributeString(XmlSerializerSettings.ObjectIdAttributeName, id.ToString());
                }

                //escribo las propiedades que son elementos
                this.WriteProperties(metadata, entity, entityTypeDescriptor, writer, context, false);
            }
            else
            {
                //me fijo si ya existe en el context
                long id = context.Stack.GetInstanceReferenceId(entity);
                writer.WriteAttributeString(XmlSerializerSettings.ObjectReferenceAttributeName, id.ToString());
            }

            //escribo el nombre de la propiedad
            writer.WriteEndElement();
        }
Example #4
0
        protected override object DoFromXml(object parent, PropertyDescriptor metadata, Type entityType, XmlReader reader, XmlSerializerContext context)
        {
            long id = this.GetInstanceId(reader);

            //obtengo el descriptor de la entidad
            TypeDescriptor entityTypeDescriptor = context.GetTypeDescriptor(entityType);

            if (entityTypeDescriptor != null)
            {
                //creo la instancia
                object entity = Activator.CreateInstance(entityType, true);

                //agrego la instancia al contexto
                context.Stack.AddInstance(id, entity);

                //deserializo los atributo
                this.DeserializeAttributes(entity, entityTypeDescriptor, reader, context);

                //deserializo los tag..
                //si es un elemento vacio, lo devuelvo
                if (reader.NodeType == XmlNodeType.EndElement || reader.IsEmptyElement)
                {
                    //avanzo
                    if (reader.IsEmptyElement)
                    {
                        reader.Read(); //avanzo para ubicarme en el siguiente nodo.
                    }
                }
                else
                {
                    this.DeserializeElements(entity, entityTypeDescriptor, reader, context);
                }

                return(entity);
            }
            else
            {
                reader.Skip();
            }

            return(null);
        }