返回具有导航对象集合的对象时的序列化问题

时间:2011-12-24 19:47:58

标签: wcf entity-framework rest

我正在使用WCF WebAPI来创建REST服务和EF4。在返回具有NavigationProperty的对象(PO​​CO类)时,我遇到了序列化异常:

  

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

以下是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 个答案:

答案 0 :(得分:1)

我认为您不能以这种方式将Properties序列化为接口,否则反序列化器将不知道在反序列化对象时要创建哪种具体类型。

您可以将ICollection属性更改为List<T>等具体类型吗?