2012-02-16 197 views
0

我有问题将我的对象从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)]时,我在客户端上收到错误null参考错误。如果我删除它,我会收到错误Not Found。我试过KnowTypeServiceKnownType,但没有奏效。我检查了svcTrace,它只是说序列化错误。我在哪里做错了。

SVC TRACE 设置InnerException消息是“类型 'xxxCoverageEntity' 数据合同名称 'xxxCoverageEntity:http://schemas.datacontract.org/2004/07/xxxBusinessEntities预计不会'。添加不是静态已知的已知类型

这里xxxCoverageEntity列表中的任何类型的Child_A样品

+0

嘿,也许你有这个问题的解决方案? – Jacob 2016-05-05 07:54:20

回答

0

您需要DataMember注释集合,否则将无法得到初始化。您还需要注释DataContractKnownType(typeof(ChildCollection))否则它不知道什么类型的“一事一议” ICollection是,因此如何序列化

同样,你将需要添加[DataMember]Child_AName财产,否则将没有序列化

+0

我之前和现在尝试过,但在客户端,我得到NullReference异常。更新后的帖子是我现在拥有的 – hungryMind 2012-02-16 15:02:27

+0

当我从Children属性中删除[DataMember]时,它将用空列表序列化,否则为空引用异常 – hungryMind 2012-02-16 15:21:16

+0

您可以通过创建控制台应用程序并调用服务来检查这是纯粹的Silverlight事物吗? – 2012-02-16 15:30:01