Проблема с сериализацией при возврате объекта, имеющего коллекцию объектов навигации - PullRequest
2 голосов
/ 24 декабря 2011

Я использую WCF WebAPI для создания сервиса REST и EF4.При возврате объекта (класса POCO), который имеет NavigationProperty, я получаю следующее исключение сериализации:

Невозможно сериализовать член Models.Customer.Orders типа System.Collections.Generic.ICollection`1 [[Models.Order, Models, Version = 1.0.0.0, Culture = нейтральный, 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 Ответ

1 голос
/ 25 декабря 2011

Я не думаю, что вы можете сериализовать Properties как интерфейсы таким образом, иначе десериализатор не будет знать, какой конкретный тип создать при десериализации объекта.

Можете ли вы изменить свойство ICollectionк конкретному типу, как List<T>?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...