Сериализация вложенного списка - PullRequest
0 голосов
/ 16 февраля 2012

У меня проблема с переносом моего объекта из WCF в SL3.

interface IComposite {
   ICollection<Child_A> Children{ get; set; }
}
[DataContract]
[knownType(typeof(ChildCollection))]
[knownType(typeof(ICollection<Child_A>))]
class Composite : IComposite {
    ChildCollection c = null;
    [DataMember]
    public string Name { get;set;}
    [DataMember]
    public ICollection<Child_A> Children { get { 
         return c??(c=new ChildCollection()); 
    }  set;}
}
[CollectionDataContract]
class ChildCollection : List<Child_A> {
}
[DataContract]
class Child_A {
    [DataMember]
    string Name { get;set; }
}
[OperationContract]
Composite GetData(){
   var data = new Composite();
   data.Children.Add( new Child_A() { Name = "child_a_1" } );
   return data;
}

Когда я вызываю сервис из SL3, я получаю объект Composite, но в списке нет ни одного элемента.Есть другие коллекции в Composite.Когда я устанавливаю [DataMember(Order=0/1)], я получаю ошибку nullreference error на клиенте.И если я удаляю его, я получаю ошибку Not Found.Я пробовал KnowType и ServiceKnownType, но не получилось.Я проверил svcTrace, он просто говорит Ошибка сериализации.Где я делаю не так.

SVC TRACE Сообщение InnerException было 'Type' xxxCoverageEntity 'с именем контракта данных' xxxCoverageEntity: http://schemas.datacontract.org/2004/07/xxxBusinessEntities' не ожидается.Добавьте любые типы, которые не известны статически, в список известных типов

Здесь xxxCoverageEntity - это Child_A в образце

1 Ответ

0 голосов
/ 16 февраля 2012

Вам нужно аннотировать коллекцию с помощью DataMember, иначе она не будет сериализована вообще. Вам также нужно будет пометить DataContract с помощью KnownType(typeof(ChildCollection)), так как в противном случае он не будет знать, что это за "вещь" ICollection и, следовательно, как ее сериализовать

Аналогичным образом вам нужно будет добавить [DataMember] в Child_A Name свойство, иначе оно не будет сериализовано

...