Domanda

NOTA: XMLIgnora NON è la risposta!

OK, quindi faccio seguito alla mia domanda Serializzazione XML e tipi ereditati, ho iniziato a integrare quel codice nella mia applicazione su cui sto lavorando, pensando stupidamente che tutto andrà bene..

Ho riscontrato problemi con un paio di classi che ho implementato IEnumerabile E ICollezione<T>

Il problema con questi è che quando XMLSerializer arriva a serializzarli, li vede come una proprietà esterna e invece di utilizzare la proprietà che vorremmo (ad esempioquello con il nostro AbstractXmlSerializer ) arriva qui e cade (a causa della mancata corrispondenza del tipo), riportandoci praticamente al punto di partenza.Non puoi decorare questi metodi con il XmlIgnore attributo, quindi non possiamo fermarlo in questo modo.

La mia soluzione attuale è rimuovere l'implementazione dell'interfaccia (in questa applicazione attuale, non è un grosso problema, ha solo reso il codice più carino).

Devo mettere da parte il mio orgoglio per questo e accettare che non si possa fare? So di aver spinto e ottenuto di più da XmlSerializer di quanto ci si aspettasse :)


Modificare

Dovrei anche aggiungere che attualmente sto lavorando nel framework 2.


Aggiornamento

Ho accettato la risposta di lomaxx.Nel mio scenario non posso effettivamente farlo, ma so che funzionerà.Poiché non ci sono stati altri suggerimenti, ho finito per rimuovere l'implementazione dell'interfaccia dal codice.

È stato utile?

Soluzione

puoi aggirare questo problema procurandoti la dll System.RunTime.Serialization (è un assembly .net 3.x) e facendovi riferimento dall'applicazione .net 2.0.Funziona perché i file binari di .net 3.0 sono compilati per essere eseguiti su .net 2.0 CLR.

In questo modo, ottieni l'accesso a DataContractSerliazer che ho utilizzato per aggirare un problema simile in cui volevo passare una ICollection come parametro a un servizio web e xmlserializer non sapeva come gestirlo correttamente.

Se sei disposto a utilizzare la dll .net 3.x nella tua applicazione 2.x dovresti essere in grado di utilizzare DataContractSerializer per risolvere questo problema

Altri suggerimenti

Immagino che la risposta arrivi troppo tardi per essere utile per la tua particolare applicazione, ma forse ci sono altre persone che hanno lo stesso problema.

suppongo che tu possa implementare IXmlSerializable per il tipo IEnumerable per aggirare questo comportamento.tuttavia, ciò significa che devi controllare completamente il processo di serializzazione per questo tipo.un approccio semplice per non dover fare confusione con XmlReader / XmlWriter, puoi scrivere una classe adattatore xml helper con ctor pubblico e proprietà di lettura-scrittura pubbliche di tutti i dati da serializzare e creare un oggetto XmlSerializer temporaneo per questo tipo all'interno IXmlSerializable.[Leggi|Scrivi]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));
}
}

Se utilizzi questi attributi:

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

Dove ProviderPatientList eredita List<PatientList>

È quindi possibile avere un maggiore controllo sull'output XML creerà

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top