4

Я пытаюсь использовать XMLSerializer с замком активного звукозаписывающего классом, который выглядит следующим образом:Как использовать XMLSerializer с Castle ActiveRecord, содержащим IList <T> члена

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

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

Однако XMLSerializer сталкивается с трудностями, потому что интерфейса IList. (Поднимает исключение: Не может сериализовать УЧАСТНИК DataModel.Documents 'типа «System.Collections.Generic.IList`1 ....)

Я читал в другом месте, что это ограничение в XMLSerializer и рекомендуемом обходной путь - объявить его как интерфейс List<T>.

Поэтому я попытался изменить IList<Document> на List<Document>. Это вызывает активацию ActiveRecord: Тип свойства DataModel.Documents должен быть интерфейсом (IList, ISet, IDictionary или их общие счетные части). Вы не можете использовать ArrayList или List как тип свойства.

Итак, вопрос в следующем: как вы используете XMLSerializer с замком ActiveRecord, содержащим член IList?

ответ

3

Интересное ... лучшее, что я могу предложить, это использовать [XmlIgnore] на Documents - и имеет ли ActiveRecord аналогичный способ игнорировать пользователя? Вы могли бы сделать что-то вроде:

[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

Спасибо, это работает. Интерфейс становится немного загрязненным из-за дополнительного свойства, но я действительно не вижу большого выбора, если Microsoft не сделает что-то о проблеме сериализации IList . – 2009-04-16 16:39:12

+0

Я читал, что это не ошибка, а функция, и способ обойти ее - использовать объекты передачи данных (или DTO). – Vamos

1

Microsoft won't implement this, так что вы должны работать вокруг него. Один из способов будет использовать необщего IList:

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

Here «s еще некоторая информация об этой ошибке.

+0

Спасибо за указание на отчет об ошибке Microsoft. Это действительно отстой, что они не фиксируют это. Я не хочу потерять преимущества безопасности типов при использовании общего списка, поэтому мне придется либо пойти на решение, предложенное Marc выше, либо переложить все на DataContractSerializer. – 2009-04-16 16:45:59