【问题标题】:Nested List serialization嵌套列表序列化
【发布时间】:2012-02-16 12:42:21
【问题描述】:

我在将我的对象从 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 错误。如果我删除它,我会收到错误 Not Found。我试过KnowTypeServiceKnownType 但没有用。我检查了 svcTrace,它只是说序列化错误。我在哪里做错了。

SVC 追踪 InnerException 消息是 'Type 'xxxCoverageEntity',数据合同名称为 'xxxCoverageEntity : http://schemas.datacontract.org/2004/07/xxxBusinessEntities' 不是预期的。将任何静态未知的类型添加到已知类型列表中

这里 xxxCoverageEntity 是示例中的 Child_A

【问题讨论】:

  • 嘿,你有解决这个问题的办法吗?

标签: wcf serialization silverlight-3.0


【解决方案1】:

您需要使用DataMember 注释集合,否则它根本不会被序列化。您还需要用KnownType(typeof(ChildCollection)) 注释DataContract,否则它不知道ICollection 是什么类型的“东西”,因此不知道如何序列化它

同样,您需要将[DataMember] 添加到Child_A Name 属性,否则它不会被序列化

【讨论】:

  • 我之前和现在都试过这个,但是在客户端我得到了 NullReference 异常。更新后的帖子就是我现在拥有的
  • 当我从 Children 属性中删除 [DataMember] 时,它会以空列表序列化,否则 nullreference 异常
  • 您能否通过创建控制台应用程序并调用服务来检查这是否纯粹是 Silverlight 的事情?
  • GetData 中的代码是否应为data.Children.Add?根据您显示的内容,您没有对复合材料的添加操作。您还可以在服务中打开消息记录并确保数据从服务中流出吗?
  • 没错,children.add。添加了来自 svcLog 的跟踪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 2014-07-23
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多