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()); }
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 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); }