2011-12-24 59 views
2

我正在使用WCF WebAPI创建REST服务和EF4。而返回其具有NavigationProperty一个对象(PO​​CO类的),我得到以下序列化异常:返回具有导航对象集合的对象时的序列化问题

无法序列类型System.Collections.Generic.ICollection`1 [[模型的构件Models.Customer.Orders。 Order,Models,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]],因为它是一个接口。

以下是POCO类

[Serializable] 
[DataContract(IsReference = true)] 
[KnownType(typeof(Order))] 
public partial class Customer 
{ 
    #region Primitive Properties 
    [DataMember] 
    public virtual int CustomerID { get; set; } 

    [DataMember] 
    public virtual string CustomerCode { get; set; } 

    [DataMember] 
    public virtual string Description { get; set; } 

    [DataMember] 
    public virtual string Comments { get; set; } 

    [DataMember] 
    public virtual bool DeleteFlag { get; set; } 

    [DataMember] 
    public virtual byte[] RowVersion { get; set; } 
    #endregion 
    #region Navigation Properties 

    [DataMember] 
    public virtual ICollection<Order> Orders 
    { 
     get 
     { 
      if (_order == null) 
      { 
       var newCollection = new FixupCollection<Order>(); 
       newCollection.CollectionChanged += FixupOrders; 
       _order = newCollection; 
      } 
      return _order; 
     } 
     set 
     { 
      if (!ReferenceEquals(_order, value)) 
      { 
       var previousValue = _order as FixupCollection<Order>; 
       if (previousValue != null) 
       { 
        previousValue.CollectionChanged -= FixupOrders; 
       } 
       _order = value; 
       var newValue = value as FixupCollection<Order>; 
       if (newValue != null) 
       { 
        newValue.CollectionChanged += FixupOrders; 
       } 
      } 
     } 
    } 
    private ICollection<Order> _order; 

    #endregion 
    #region Association Fixup 

    private void FixupOrders(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems != null) 
     { 
      foreach (Order item in e.NewItems) 
      { 
       item.Customer = this; 
      } 
     } 

     if (e.OldItems != null) 
     { 
      foreach (Order item in e.OldItems) 
      { 
       if (ReferenceEquals(item.Customer, this)) 
       { 
        item.Customer = null; 
       } 
      } 
     } 
    } 

    #endregion 
} 

服务的方法如下:

[WebGet(UriTemplate = "Customer", 
     RequestFormat = WebMessageFormat.Xml, 
     ResponseFormat = WebMessageFormat.Xml)] 
public List<Customer> Get() 
{ 
    CustEntities context = new CustEntities(); 
    return context.Customer.Include("Orders").ToList(); 
} 

在上述方面的任何帮助,是非常可观的。

感谢

回答

1

我不认为你可以序列化属性在这样的接口,否则解串器不知道当对象序列化,以创造出具体类型。

您是否可以将ICollection物业更改为List<T>等具体类型?

+0

我们正在使用EF T4模板创建POCO类。我们不想改变T4模板。是否有任何解决方法实现上述。 – SKumars 2011-12-25 12:52:52

+0

你有没有试过在你的客户类中加入[KnownType(typeof(FixupCollection))]]? – 2011-12-27 23:47:08