2012-05-07 4 views
2

У меня есть обернутый список, который выглядит следующим образом:JSON.NET не десериализации обернутого коллекцию

[Serializable] 
public class OrderManager : IEnumerable<Order> 
{ 
    public OrderManager() 
    { } 

    private List<Order> orders = new List<Order>(); 

    public void AddOrder(Order order) 
    { 
     orders.Add(order); 
    } 

    public IEnumerator<Order> GetEnumerator() 
    { 
     return orders.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return orders.GetEnumerator(); 
    } 
} 

Я включил экземпляр поля в классе клиента, как это:

[Serializable] 
public class Customer 
{ 
    public Customer() 
    { } 

    private OrderManager _orders 
     = new OrderManager(); 
    public OrderManager Orders 
    { 
     get { return _orders; } 
     set { _orders = value; } 
    } 
} 

Я создаю Серийный анализатор JSON.NET:

private JsonSerializer GetSerializer() 
{ 
    var serializer = new JsonSerializer(); 

    // on or off the type name handling doesn't help 
    //serializer.TypeNameHandling = TypeNameHandling.All; 

    var contractResolver = new DefaultContractResolver(true); 
    contractResolver.IgnoreSerializableAttribute = false; 
    contractResolver.IgnoreSerializableInterface = false; 

    serializer.ContractResolver = contractResolver; 

    serializer.PreserveReferencesHandling = PreserveReferencesHandling.All; 
    serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 

    return serializer;   
} 

Сериализация объекта клиента работает, но во время десериализации я получаю сообщение об ошибке :

Error setting value to '_orders' on 'Tests.SerializationTests+Customer'.

С TypeNameHandling установлен Все, что я получаю это:

Type specified in JSON 'Tests.SerializationTests+Order[], Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not compatible with 'Tests.SerializationTests+OrderManager, Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Path '_orders.$type', line 1, position 232. 

Любую идею, как получить Json.NET играть хорошо с обернутым списком?

ответ

1

Я думаю, вам нужно реализовать ICollection<Order>

public class OrderManager : IEnumerable<Order>,ICollection<Order> 

-

[Serializable] 
public class OrderManager : IEnumerable<Order>,ICollection<Order> 
{ 
    public OrderManager() 
    { } 

    private List<Order> orders = new List<Order>(); 

    public Order this[int i] 
    { 
     set { AddOrder(value); } 
     get { return orders[i]; } 
    } 

    public void AddOrder(Order order) 
    { 
     orders.Add(order); 
    } 

    public IEnumerator<Order> GetEnumerator() 
    { 
     return orders.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return orders.GetEnumerator(); 
    } 

    public void Add(Order item) 
    { 
     AddOrder(item); 
    } 

    public void Clear() 
    { 
     orders.Clear(); 
    } 

    public bool Contains(Order item) 
    { 
     return orders.Contains(item); 
    } 

    public void CopyTo(Order[] array, int arrayIndex) 
    { 
     throw new NotImplementedException(); 
    } 

    public int Count 
    { 
     get { return orders.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get { return false; } 
    } 

    public bool Remove(Order item) 
    { 
     return orders.Remove(item); 
    } 
} 
+0

А-Ха! В этом есть смысл! Мне нужна моя логика для Add, и просто верните false внутри remove, так как я не хочу поддерживать удаление. Прекрасно работает! Благодаря! – mbursill

0

Попробуйте один из этих двух вещей:

Сделать класс коллекции обертки своего списка под названием OrderCollection:

[Serializable]/[DataContract] 
public OrderCollection : List<Order> { ... } 

Или попробуйте включить LIST в array.

Дайте нам знать, как работает один из них.

0

Я не уверен, что сериализация работает с IEnumerable, не могли бы вы попробовать его со списком?

[Serializable] 
public class OrderManager : List<Order> 
+0

я пошел с обернутой список (IEnumerable не Перечислите ), чтобы обеспечить собственные добавления/удаления методов с дополнительная логика. Выявление OrderManager как списка, похоже, хорошо работает с Json.NET, но действительно меняет порядок работы класса OrderManager. – mbursill

Смежные вопросы