4

Je suis en train d'utiliser le XMLSerializer avec un château classe record actif qui se présente comme suit:Comment utiliser XMLSerializer avec un château ActiveRecord contenant un IList <T> membre

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

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

Cependant, le XMLSerializer est en difficulté parce que de l'interface IList. (Soulève exception: Ne peut pas sérialiser membres « DataModel.Documents » de type « System.Collections.Generic.IList`1 ....)

J'ai lu ailleurs que c'est une limitation dans le XMLSerializer et recommandé solution de contournement consiste à déclarer comme une interface List<T> à la place. Par conséquent, j'ai essayé de changer le IList<Document> en List<Document>. ActiveRecord déclenche une exception: Type de propriété DataModel.Documents doit être une interface (IList, ISet, IDictionary ou leurs parties génériques). Vous ne pouvez pas utiliser ArrayList ou List comme type de propriété. Donc, la question est: Comment utiliser XMLSerializer avec un Castle ActiveRecord contenant un membre IList?

Répondre

3

Intéressant ... le meilleur que je peux suggérer est d'utiliser [XmlIgnore] sur Documents - et ActiveRecord a-t-il une manière similaire d'ignorer un membre? Vous pouvez faire quelque chose comme:

[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); } 
    } 
} 
+0

Merci, cela fonctionne. L'interface devient un peu polluée en raison de la propriété supplémentaire, mais je ne vois pas vraiment beaucoup de choix à moins que Microsoft ne fasse quelque chose à propos du problème de sérialisation IList . –

+0

J'ai lu que ce n'est pas un bug, mais une fonctionnalité, et le moyen de contourner le problème est d'utiliser des objets de transfert de données (ou DTO). – Vamos

1

Microsoft won't implement this, vous devez travailler autour d'elle. Un moyen serait d'utiliser le IList non générique:

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

Here est un peu plus d'informations sur ce bogue.

+0

Merci de m'avoir indiqué le rapport de bug de Microsoft. Ça craint vraiment qu'ils ne règlent pas ça. Je ne veux pas perdre l'avantage d'utiliser la liste générique pour la sécurité des types, donc je vais devoir soit opter pour la solution suggérée par Marc ci-dessus, soit passer tout à DataContractSerializer. –

Questions connexes