JSON.NET无法反序列化包装的集合 [英] JSON.NET cannot deserialize a wrapped collection

查看:57
本文介绍了JSON.NET无法反序列化包装的集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包装好的清单,看起来像这样:

I have a wrapped list that looks like this:

[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();
    }
}

我在这样的客户类中包括一个字段实例:

I include a field instance in a customer class like this:

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

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

我这样创建JSON.NET序列化器:

I create the JSON.NET serializer like this:

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;          
}

客户对象的序列化是可行的,但是在反序列化过程中,我收到错误消息:

Serialization of a customer object works, but during deserialization I get the error:

错误地将值设置为"_orders" "Tests.SerializationTests + Customer".

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

在TypeNameHandling设置为All的情况下,我得到了:

With TypeNameHandling set to All I get this:

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在包裹列表中很好地发挥作用吗?

Any idea how to get Json.NET to play nice with the wrapped list?

推荐答案

我想您需要实现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);
    }
}

这篇关于JSON.NET无法反序列化包装的集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆