4 Stimmen

Verwendung von XMLSerializer mit einem Castle ActiveRecord, der ein IList<T>-Mitglied enthält

Ich versuche, den XMLSerializer mit einem Schloss aktiven Datensatz Klasse zu verwenden, die wie folgt aussieht:

[ActiveRecord("Model")]
public class DataModel : ActiveRecordBase
{
    private IList<Document> documents;

    [XmlArray("Documents")]
    public virtual IList<Document> Documents
    {
        get { return documents; }
        set
        {
            documents = value;    
        }
    }
}

Der XMLSerializer gerät jedoch aufgrund der IList-Schnittstelle in Schwierigkeiten. (Löst eine Ausnahme aus: Das Mitglied 'DataModel.Documents' vom Typ 'System.Collections.Generic.IList`1.... kann nicht serialisiert werden. )

Ich habe an anderer Stelle gelesen, dass dies eine Einschränkung in der XMLSerializer ist und die empfohlene Problemumgehung ist, um es als eine List<T> Schnittstelle.

Deshalb habe ich versucht, die IList<Document> a List<Document> . Dies führt dazu, dass ActiveRecord eine Exception auslöst: Der Typ der Eigenschaft DataModel.Documents muss eine Schnittstelle sein (IList, ISet, IDictionary oder ihre generischen Gegenstücke). Sie können nicht ArrayList oder List als Eigenschaftstyp verwenden.

Die Frage ist also: Wie verwendet man den XMLSerializer mit einem Castle ActiveRecord, der ein IList-Mitglied enthält?

3voto

Marc Gravell Punkte 970173

Interessant... das Beste, was ich vorschlagen kann, ist die Verwendung von [XmlIgnore] en Documents - und gibt es in ActiveRecord eine ähnliche Möglichkeit, ein Mitglied zu ignorieren? Sie könnten etwas tun wie:

[XmlIgnore]
public virtual IList<Document> Documents
{
    get { return documents; }
    set
    {
        documents = value;    
    }
}

[Tell ActiveRecord to ignore this one...]
[XmlArray("Documents"), XmlArrayItem("Document")]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public Document[] DocumentsSerialization {
    get {
         if(Documents==null) return null;
         return Documents.ToArray(); // LINQ; or do the long way
    }
    set {
         if(value == null) { Documents = null;}
         else { Documents = new List<Document>(value); }
    }
}

1voto

Mauricio Scheffer Punkte 97391

Microsoft wird dies nicht umsetzen Sie müssen also damit umgehen. Eine Möglichkeit wäre die Verwendung der nicht-generischen IList :

[ActiveRecord("Model")]
public class DataModel : ActiveRecordBase<DataModel> {
    [XmlArray("Documents")]
    [HasMany(typeof(Document)]
    public virtual IList Documents {get;set;}
}

Hier finden Sie weitere Informationen zu diesem Fehler.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X