【问题标题】:Serialization issue while returning object having collection of Navigation Objects返回具有导航对象集合的对象时的序列化问题
【发布时间】:2011-12-24 19:47:58
【问题描述】:

我正在使用 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();
}

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

谢谢

【问题讨论】:

    标签: wcf entity-framework rest


    【解决方案1】:

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

    您能否将您的 ICollection 属性更改为具体类型,例如 List&lt;T&gt;

    【讨论】:

    • 我们正在使用 EF T4 模板创建 POCO 类。我们不想更改 T4 模板。是否有任何解决方法可以实现上述目标。
    • 您是否尝试将[KnownType(typeof(FixupCollection))] 添加到您的客户类?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2012-07-31
    • 2020-02-24
    相关资源
    最近更新 更多