예제 #1
0
        private void DeserializeElements(IDictionary parent, DictionaryPropertyDescriptor propDesc, XmlReader reader, XmlSerializerContext context)
        {
            //avanzo hasta la posicion del elemento
            string nodeName = reader.LocalName;

            //avanzo hasta el primer nodo
            bool        end      = !reader.Read();
            XmlNodeType typeNode = reader.MoveToContent();

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

            //parseo las propiedades
            while (!end)
            {
                //me fijo si la propiedad es vacia
                if (reader.NodeType != XmlNodeType.EndElement)
                {
                    //tengo que leer el item del diccionario
                    this.DeserializeDictionaryItem(parent, keyDesc, valueDesc, reader, context);
                }


                reader.Read();
                //avanzo...
                typeNode = reader.MoveToContent();
                end      = reader.NodeType == XmlNodeType.EndElement && reader.LocalName.Equals(nodeName);
            }

            reader.Read();
        }
예제 #2
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();
        }