Beispiel #1
0
        protected override object DoFromXml(object parent, PropertyDescriptor propDesc, Type entityType, XmlReader reader, XmlSerializerContext context)
        {
            long   id       = this.GetInstanceId(reader);
            string nodeName = reader.LocalName;
            DictionaryPropertyDescriptor metadata = propDesc.GetPropertyDescriptor <DictionaryPropertyDescriptor>(entityType, context);

            IDictionary items = (IDictionary)Activator.CreateInstance(entityType, true);

            //recorro todos los items
            if (reader.NodeType == XmlNodeType.EndElement || reader.IsEmptyElement)
            {
                //avanzo
                if (reader.IsEmptyElement)
                {
                    reader.Read(); //avanzo para ubicarme en el siguiente nodo.
                }
            }
            else
            {
                this.DeserializeElements(items, metadata, reader, context);
            }

            //agrego el diccionario al stack
            context.Stack.AddInstance(id, items);

            //creo un array
            return(items);
        }
        protected override object DoFromXml(object parent, PropertyDescriptor metadata, Type entityType, XmlReader reader, XmlSerializerContext context)
        {
            string attributeName = null;
            string elementName   = null;
            string val           = null;
            object output        = null;
            ValueTypePropertyDescriptor valPropDesc = metadata.GetPropertyDescriptor <ValueTypePropertyDescriptor>(entityType, context);

            //si el reader esta parado sobre un atributo.....entonces, el tipo lo obtengo a partir del atributo
            if (reader.NodeType == XmlNodeType.Attribute)
            {
                attributeName = reader.Name;
            }
            else
            {
                elementName   = reader.LocalName;
                attributeName = valPropDesc.GetAttributeNameForType(entityType, context);
            }

            if (string.IsNullOrEmpty(elementName))
            {
                //esta definido en el atributo, lo escribo
                string propAttName = valPropDesc.GetAttributeNameForType(entityType, context);

                if (string.Compare(attributeName, propAttName) == 0)
                {
                    val    = reader.Value;
                    output = this.GetValueFromString(valPropDesc.GetPropertyDescriptor <ValueTypePropertyDescriptor>(entityType, context), val, entityType, context);
                }
            }
            else
            {
                if (string.IsNullOrEmpty(attributeName))
                {
                    val = reader.ReadElementContentAsString();
                }
                else
                {
                    if (reader.MoveToAttribute(attributeName))
                    {
                        //avanzo el elemento
                        val = reader.Value;
                        reader.Read();
                    }
                    else
                    {
                        //esta en el contenido del elemento
                        val = reader.ReadElementContentAsString();
                    }
                }

                output = this.GetValueFromString(valPropDesc, val, entityType, context);
            }

            return(output);
        }
        protected override void DoToXml(object parent, PropertyDescriptor propDescritor, object entity, XmlTextWriter writer, XmlSerializerContext context)
        {
            Type entityType = entity.GetType();
            ValueTypePropertyDescriptor metadata = propDescritor.GetPropertyDescriptor <ValueTypePropertyDescriptor>(entityType, context);

            if (metadata.IsXmlContentText)
            {
                if (!TypeHelper.IsDefaultValue(entity, entityType) || context.Settings.WriteDefaultValues)
                {
                    string valueStr    = this.GetValueAsString(metadata, entity, entityType, context);
                    string elementName = metadata.GetElementNameForType(entityType, context, true);

                    //escribo el nombre del elemento...
                    writer.WriteStartElement(elementName);

                    //recorro el contenido
                    StringReader  stringReader = new StringReader(valueStr);
                    XmlTextReader reader       = new XmlTextReader(stringReader);

                    try
                    {
                        reader.MoveToContent();
                        //recorro todos los attributos y los escribo en el destino
                        if (reader.MoveToFirstAttribute())
                        {
                            writer.WriteAttributeString(reader.LocalName, reader.Value);
                            while (reader.MoveToNextAttribute())
                            {
                                writer.WriteAttributeString(reader.LocalName, reader.Value);
                            }
                        }

                        reader.MoveToContent();
                        string str = reader.ReadInnerXml();
                        writer.WriteRaw(str);
                    }
                    finally
                    {
                        stringReader.Close();
                        reader.Close();
                    }

                    //cierro el tag
                    writer.WriteEndElement();
                }
            }
            else
            {
                base.DoToXml(parent, metadata, entity, writer, context);
            }
        }
        protected override object DoFromXml(object parent, PropertyDescriptor propDesc, Type entityType, XmlReader reader, XmlSerializerContext context)
        {
            ValueTypePropertyDescriptor metadata = propDesc.GetPropertyDescriptor <ValueTypePropertyDescriptor>(entityType, context);

            if (metadata.IsXmlContentText)
            {
                //tengo que leer todo el contenido...
                return(string.Intern(reader.ReadOuterXml()));
            }
            else
            {
                return(base.DoFromXml(parent, metadata, entityType, reader, context));
            }
        }
Beispiel #5
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();
        }
        protected override void DoToNullValueXml(object parent, PropertyDescriptor metadata, XmlTextWriter writer, XmlSerializerContext context)
        {
            Type entityType = metadata.Metadata.PropertyType;

            ValueTypePropertyDescriptor desc = metadata.GetPropertyDescriptor <ValueTypePropertyDescriptor>(entityType, context);

            if (!desc.IsXmlElement(entityType, context))
            {
                string attributeName = metadata.GetAttributeNameForType(entityType, context);
                //esta definido el atributo, lo escribo
                writer.WriteAttributeString(attributeName, "");
            }
            else
            {
                string elementName = desc.GetElementNameForType(entityType, context, true);

                //escribo el nombre de la propiedad
                writer.WriteElementString(elementName, "");
            }
        }
Beispiel #7
0
        protected override void DoToXml(object parent, PropertyDescriptor propDesc, object entity, XmlTextWriter writer, XmlSerializerContext context)
        {
            Type entityType = entity.GetType();
            DictionaryPropertyDescriptor metadata = propDesc.GetPropertyDescriptor <DictionaryPropertyDescriptor>(entityType, context);

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

            writer.WriteStartElement(nodeName);

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

                base.WriteTypeDefinition(metadata, entityType, context, writer);

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

                IDictionary dic = (IDictionary)entity;

                DictionaryKeyValuePropertyDescriptor keyDesc   = metadata.GetDictionaryItemKeyPropertyDescriptor(context);
                DictionaryKeyValuePropertyDescriptor valueDesc = metadata.GetDictionaryItemValuePropertyDescriptor(context);

                foreach (DictionaryEntry item in dic)
                {
                    this.SerializeDictionaryItem(dic, item, metadata, keyDesc, valueDesc, writer, context);
                }
            }
            else
            {
                //me fijo si ya existe en el context
                long id = context.Stack.GetInstanceReferenceId(entity);
                writer.WriteAttributeString(XmlSerializerSettings.ObjectReferenceAttributeName, id.ToString());
            }

            writer.WriteEndElement();
        }
        protected override void DoToXml(object parent, PropertyDescriptor metadata, object entity, XmlTextWriter writer, XmlSerializerContext context)
        {
            Type entityType = entity.GetType();

            if (!TypeHelper.IsDefaultValue(entity, entityType) || context.Settings.WriteDefaultValues)
            {
                ValueTypePropertyDescriptor desc = metadata.GetPropertyDescriptor <ValueTypePropertyDescriptor>(entityType, context);
                string valueStr = this.GetValueAsString(desc, entity, entityType, context);

                if (!desc.IsXmlElement(entityType, context))
                {
                    string attributeName = metadata.GetAttributeNameForType(entityType, context);
                    //esta definido el atributo, lo escribo
                    writer.WriteAttributeString(attributeName, valueStr);
                }
                else
                {
                    string elementName = desc.GetElementNameForType(entityType, context, true);

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

                    base.WriteTypeDefinition(desc, entityType, context, writer);

                    if (desc.IsXmlAttribute(entityType, context))
                    {
                        string attributeName = metadata.GetAttributeNameForType(entityType, context);
                        //escribo el valor
                        writer.WriteAttributeString(attributeName, valueStr);
                    }
                    else
                    {
                        writer.WriteRaw(valueStr);
                    }
                    //writer.WriteString(valueStr); si tiene caracteres de xml los convierte a &amp

                    //cierro el tag
                    writer.WriteEndElement();
                }
            }
        }
Beispiel #9
0
        protected override void DoToXml(object parent, PropertyDescriptor propDesc, object entity, XmlTextWriter writer, XmlSerializerContext context)
        {
            Type entityType = entity.GetType();
            ListPropertyDescriptor metadata = propDesc.GetPropertyDescriptor <ListPropertyDescriptor>(entityType, context);

            if (metadata.IsInlineAttributeArray(entityType, context))
            {
                this.WriteInlineArrayAsAttribute(parent, metadata, entity, entityType, writer, context);
            }
            else
            {
                //deberia validar si la lista ya se agrego....y colocar una referencia..
                if (metadata.IsInlineElementArray(entityType, context))
                {
                    this.WriteInlineArrayAsElement(parent, metadata, entity, entityType, writer, context);
                }
                else
                {
                    this.WriteArrayAsElement(parent, metadata, entity, entityType, writer, context);
                }
            }
        }
Beispiel #10
0
        protected override object DoFromXml(object parent, PropertyDescriptor propDesc, Type entityType, XmlReader reader, XmlSerializerContext context)
        {
            //string nodeName = reader.LocalName;
            ListPropertyDescriptor metadata = propDesc.GetPropertyDescriptor <ListPropertyDescriptor>(entityType, context);

            IList items;

            //creo una lista para luego transformarla en un array....si es una lista
            if (entityType.IsArray)
            {
                items = new ArrayList();
            }
            else if (entityType.IsInterface)
            {
                if (entityType.IsGenericType)
                {
                    Type entityItemType = entityType.GetGenericArguments()[0];
                    Type listType       = typeof(List <>);
                    listType = listType.MakeGenericType(entityItemType);
                    items    = (IList)Activator.CreateInstance(listType, true);
                }
                else
                {
                    items = new ArrayList();
                }
            }
            else
            {
                items = (IList)Activator.CreateInstance(entityType, true);
            }

            Type itemType;
            long id = 0;

            if (metadata.IsInlineAttributeArray(entityType, context))
            {
                itemType = this.DeserializeItemsFromInlineAttribute(entityType, items, metadata, reader, context);
            }
            else
            {
                //si no es inline el array, entonces tiene un id
                id = this.GetInstanceId(reader);

                //recorro todos los items
                if (reader.NodeType == XmlNodeType.EndElement || reader.IsEmptyElement)
                {
                    //avanzo
                    if (reader.IsEmptyElement)
                    {
                        reader.Read(); //avanzo para ubicarme en el siguiente nodo.
                    }
                    itemType = metadata.DeclaringItemType;
                }
                else
                {
                    if (metadata.IsInlineElementArray(entityType, context))
                    {
                        itemType = this.DeserializeItemsFromInlineElements(items, metadata, reader, context);
                    }
                    else
                    {
                        itemType = this.DeserializeItemsFromElements(entityType, items, metadata, reader, context);
                    }
                }
            }

            IList output;

            //creo un array
            if (entityType.IsArray)
            {
                output = this.CreateOutputFrom(metadata, items, entityType.GetElementType());
            }
            else
            {
                output = this.CreateOutputFrom(metadata, items, itemType);
            }

            //agrego la instancia al stack
            context.Stack.AddInstance(id, output);

            return(output);
        }
Beispiel #11
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="metadata"></param>
        /// <param name="entity"></param>
        /// <param name="writer"></param>
        /// <param name="context"></param>
        protected override void DoToXml(object parent, PropertyDescriptor metadata, object entity, XmlTextWriter writer, XmlSerializerContext context)
        {
            ConfigurationSection section = (ConfigurationSection)entity;

            if (section == null)
            {
                return;
            }

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

            if (!context.Settings.UniqueSerializationForInstance || !context.Stack.ContainsInstance(entity))
            {
                //agrego la lista a las entidades registradas
                long   id       = context.Stack.AddInstance(entity);
                string valueStr = (string)SerializeMethod.Invoke(section, new object[] { null, elementName, ConfigurationSaveMode.Full });

                //escribo el nombre del elemento...
                writer.WriteStartElement(elementName);

                //recorro el contenido
                StringReader  stringReader = new StringReader(valueStr);
                XmlTextReader reader       = new XmlTextReader(stringReader);

                try
                {
                    reader.MoveToContent();
                    //recorro todos los attributos y los escribo en el destino
                    if (reader.MoveToFirstAttribute())
                    {
                        writer.WriteAttributeString(reader.LocalName, reader.Value);
                        while (reader.MoveToNextAttribute())
                        {
                            writer.WriteAttributeString(reader.LocalName, reader.Value);
                        }
                    }

                    //me fijo si hay que escribir el id
                    //escribo el id del objeto si corresponde
                    if (context.Settings.UniqueSerializationForInstance)
                    {
                        writer.WriteAttributeString(XmlSerializerSettings.ObjectIdAttributeName, id.ToString());
                    }

                    //agrego el tipo de la entidad como ultimo atributo
                    ObjectPropertyDescriptor descriptor = metadata.GetPropertyDescriptor <ObjectPropertyDescriptor>(entityType, context);
                    base.WriteTypeDefinition(descriptor, entityType, context, writer);

                    reader.MoveToContent();
                    string str = reader.ReadInnerXml();
                    if (!string.IsNullOrEmpty(str))
                    {
                        writer.WriteRaw(str);
                    }
                }
                finally
                {
                    stringReader.Close();
                    reader.Close();
                }

                //cierro el tag
                writer.WriteEndElement();
            }
            else
            {
                writer.WriteStartElement(elementName);

                //me fijo si ya existe en el context
                long id = context.Stack.GetInstanceReferenceId(entity);
                writer.WriteAttributeString(XmlSerializerSettings.ObjectReferenceAttributeName, id.ToString());

                writer.WriteEndElement();
            }
        }