Frage

NOTIZ: XMLIgnore ist NICHT die Antwort!

OK, ich schließe mich also meiner Frage an XML-Serialisierung und geerbte Typen, Ich begann, diesen Code in meine Anwendung zu integrieren, an der ich gerade arbeite, und dachte dummerweise, dass alles gut gehen würde.

Ich hatte Probleme mit einigen Klassen, in denen ich dieses implementiert habe IEnumerable Und ICollection<T>

Das Problem dabei ist, dass der XMLSerializer sie bei der Serialisierung als externe Eigenschaft ansieht und nicht die Eigenschaft verwendet, die wir gerne hätten (d. h.der mit unserem AbstractXmlSerializer ) kommt es hierher und fällt um (aufgrund der Typinkongruenz), was uns so ziemlich wieder auf den Anfang bringt.Sie können diese Methoden nicht mit dem dekorieren XmlIgnore Attribut auch, daher können wir es nicht auf diese Weise stoppen.

Meine aktuelle Lösung besteht darin, die Schnittstellenimplementierung zu entfernen (in dieser aktuellen Anwendung ist das keine große Sache, es hat nur den Code hübscher gemacht).

Muss ich meinen Stolz darüber herunterschlucken und akzeptieren, dass es nicht möglich ist? Ich weiß, dass ich den XmlSerializer irgendwie vorangetrieben und mehr herausgeholt habe, als man von ihm erwartet hatte :)


Bearbeiten

Ich sollte auch hinzufügen, dass ich derzeit an Framework 2 arbeite.


Aktualisieren

ich habe angenommen Lomaxxs Antwort.In meinem Szenario kann ich das nicht wirklich tun, aber ich weiß, dass es funktionieren wird.Da es keine weiteren Vorschläge gab, habe ich letztendlich die Schnittstellenimplementierung aus dem Code entfernt.

War es hilfreich?

Lösung

Sie können dieses Problem umgehen, indem Sie sich die System.RunTime.Serialization-DLL (eine .net 3.x-Assembly) besorgen und in Ihrer .net 2.0-Anwendung darauf verweisen.Dies funktioniert, weil die .net 3.0-Binärdateien für die Ausführung auf der .net 2.0-CLR kompiliert sind.

Auf diese Weise erhalten Sie Zugriff auf den DataContractSerliazer, den ich verwendet habe, um ein ähnliches Problem zu umgehen, bei dem ich eine ICollection als Parameter an einen Webservice übergeben wollte und der xmlserializer nicht wusste, wie er richtig damit umgehen sollte.

Wenn Sie mit der Verwendung der .net 3.x-DLL in Ihrer 2.x-Anwendung einverstanden sind, sollten Sie in der Lage sein, dieses Problem mit dem DataContractSerializer zu lösen

Andere Tipps

Ich schätze, die Antwort kommt zu spät, um für Ihre spezielle Anwendung nützlich zu sein, aber vielleicht gibt es noch andere Leute, die das gleiche Problem haben.

Ich nehme an, Sie können IXmlSerializable für den IEnumerable-Typ implementieren, um dieses Verhalten zu umgehen.Dies bedeutet jedoch, dass Sie den Serialisierungsprozess für diesen Typ vollständig kontrollieren müssen.Um sich nicht mit dem XmlReader / IXmlSerializable.[Lesen|Schreiben]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));
}
}

Wenn Sie diese Attribute verwenden:

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

Wobei ProviderPatientList erbt List<PatientList>

Sie haben dann mehr Kontrolle über den ausgegebenen XML-Code wird erstellen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top