gpt4 book ai didi

c# - JSON.NET 无法反序列化包装的集合

转载 作者:太空宇宙 更新时间:2023-11-03 14:02:01 26 4
gpt4 key购买 nike

我有一个看起来像这样的包装列表:

[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 设置为 All 我得到这个:

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 很好地处理包装列表吗?

最佳答案

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

关于c# - JSON.NET 无法反序列化包装的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10488351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com