Pregunta

NOTA: XMLIgnorar ¡NO es la respuesta!

Bien, siguiendo con mi pregunta sobre Serialización XML y tipos heredados, Comencé a integrar ese código en mi aplicación en la que estoy trabajando, pensando estúpidamente que todo irá bien.

Tuve problemas con un par de clases. Tengo ese implemento. IEnumerable y Colección I<T>

El problema con esto es que cuando XMLSerializer llega a serializarlos, los ve como una propiedad externa y, en lugar de usar la propiedad que nos gustaría (es decir,el que tiene nuestro ResumenXmlSerializador ) viene aquí y se cae (debido a la falta de coincidencia de tipos), lo que prácticamente nos devuelve al punto de partida.No puedes decorar estos métodos con el XMLIgnorar atributo tampoco, por lo que no podemos detenerlo de esa manera.

Mi solución actual es eliminar la implementación de la interfaz (en esta aplicación actual, no es gran cosa, solo hizo que el código fuera más bonito).

¿Necesito tragarme mi orgullo por esto y aceptar que no se puede hacer? Sé que he presionado un poco y he sacado más provecho de XmlSerializer de lo que se esperaba de él :)


Editar

También debo agregar que actualmente estoy trabajando en el marco 2.


Actualizar

yo he aceptado la respuesta de lomaxx.En mi caso, no puedo hacer esto, pero sé que funcionará.Como no hubo otras sugerencias, terminé eliminando la implementación de la interfaz del código.

¿Fue útil?

Solución

Puede solucionar este problema obteniendo el archivo dll System.RunTime.Serialization (es un ensamblado .net 3.x) y haciendo referencia a él desde su aplicación .net 2.0.Esto funciona porque los archivos binarios de .net 3.0 se compilan para ejecutarse en .net 2.0 CLR.

Al hacer esto, obtienes acceso al DataContractSerliazer que he usado para solucionar un problema similar en el que quería pasar un ICollection como parámetro a un servicio web y el xmlserializer no sabía cómo manejarlo correctamente.

Si está de acuerdo con el uso de .net 3.x dll en su aplicación 2.x, debería poder usar DataContractSerializer para resolver este problema.

Otros consejos

Supongo que la respuesta llega demasiado tarde para ser útil para su aplicación particular, pero tal vez haya otras personas que tengan el mismo problema.

Supongo que puedes implementar IXmlSerializable para el tipo IEnumerable para solucionar este comportamiento.sin embargo, esto significa que debe controlar completamente el proceso de serialización para este tipo.un enfoque simple para no tener que meterse con XmlReader/XmlWriter, puede escribir una clase de adaptador xml auxiliar con ctor público y propiedades públicas de lectura y escritura de todos los datos que se van a serializar, y crear un objeto XmlSerializer temporal para este tipo dentro IXmlSerializable.[Leer|Escribir]Xml().

class Target : IEnumerable<Anything>, IXmlSerializable
{
//...

public void ReadXml(System.Xml.XmlReader reader)
{
    reader.ReadStartElement();
    TargetXmlAdapter toRead = (TargetXmlAdapter)new XmlSerializer(typeof(TargetXmlAdapter)).Deserialize(reader);
    reader.Read();

    // here: install state from TargetXmlAdapter
}

public void WriteXml(System.Xml.XmlWriter writer)
{
    // NOTE: TargetXmlAdapter(Target) is supposed to store this' state being subject to serialization
    new XmlSerializer(typeof(TargetXmlAdapter)).Serialize(writer, new TargetXmlAdapter(this));
}
}

Si utiliza estos atributos:

        [XmlArray("ProviderPatientLists")]
        [XmlArrayItem("File")]
      public ProviderPatientList Files
    {
        get { return _ProviderPatientLists; }
        set
        {
            _ProviderPatientLists = value;
        }
    }

Donde hereda ProviderPatientList List<PatientList>

Entonces puede tener más control sobre el XML salido creará

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top