4

我正在尝试将 XMLSerializer 与如下所示的城堡活动记录类一起使用:

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

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

但是,由于 IList 接口,XMLSerializer 遇到了麻烦。(引发异常:无法序列化类型为“System.Collections.Generic.IList`1....”的成员“DataModel.Documents”

我在其他地方读到这是 XMLSerializer 的一个限制,推荐的解决方法是将其声明为List<T>接口。

因此,我尝试将其更改IList<Document>List<Document>. 这会导致 ActiveRecord 引发异常: 属性 DataModel.Documents 的类型必须是一个接口(IList、ISet、IDictionary 或它们的通用计数器部分)。您不能使用 ArrayList 或 List 作为属性类型。

所以,问题是:如何将 XMLSerializer 与包含 IList 成员的 Castle ActiveRecord 一起使用?

4

2 回答 2

3

有趣...我能建议的最好的方法是使用[XmlIgnore]- DocumentsActiveRecord 是否有类似的方式来忽略成员?您可以执行以下操作:

[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); }
    }
}
于 2009-04-15T19:50:42.677 回答
1

微软不会实现这个,所以你必须解决它。一种方法是使用非泛型IList

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

是有关此错误的更多信息。

于 2009-04-15T22:35:24.450 回答