gpt4 book ai didi

c# - JSON.NET 忽略集合类型对象上的 ISerializable

转载 作者:行者123 更新时间:2023-11-30 12:14:01 24 4
gpt4 key购买 nike

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

[JsonObject(MemberSerialization.Fields)]
public class OrderManager : IEnumerable<Order>, ISerializable
{
public OrderManager()
{ }

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

public void AddOrder(OrderInfo orderInfo)
{
// do the work of making an order object from an OrderInfo.
// Add the new order object to the private list of orders
// orders.Add(order);
}

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

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

public OrderManager(SerializationInfo info, StreamingContext context)
{
// do custom serialization work here (never gets hit)
}

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
// do custom serialization work here (never gets hit)
}
}

我在客户类中包含一个字段实例,如下所示:

[JsonObject(MemberSerialization.Fields)]
public class Customer
{
public Customer()
{ }

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

我可以序列化一个客户,但是 ISerializable OrderManager 上的界面被忽略。如果我删除 JsonObject来自 OrderManager 的属性(可能是什么阻止了 ISerializable 被使用) OrderManager被视为数组,ISerializable接口(interface)仍然被忽略。

我尝试使用 ICollection而不是 IEnumerable : JSON.NET cannot deserialize a wrapped collection

因为我的包装集合是 Order 类型和我的 AddOrder方法接受 OrderInfo , 暴露ICollection<Order> 真的行不通.无论哪种方式,ISerializable接口(interface)被忽略。

有什么解决方法吗?

更新

澄清一下,我确实将 IgnoreSerializableInterface 设置为 false。

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

serializer.TypeNameHandling = TypeNameHandling.Auto;
serializer.TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;

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

serializer.ContractResolver = contractResolver;

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

return serializer;
}

最佳答案

这个答案可能会迟到但是:

这是因为它在检查 ISerializable 的继承之前检查 IEnumerable 的继承,所以它会先使用 Enumerable 接口(interface)提取对象。

您可以通过使用此覆盖实现您自己的继承自 DefaultContractResolver 的契约(Contract)解析器来覆盖此行为:

    protected override JsonContract CreateContract(Type objectType)
{
if (typeof(ISerializable).IsAssignableFrom(objectType))
return CreateISerializableContract(objectType);

return base.CreateContract(objectType);
}

最好使用一些更好的逻辑,但这在根本上会导致实现 ISerializableIEnumerable 的对象首先使用 ISerializable 实现。

关于c# - JSON.NET 忽略集合类型对象上的 ISerializable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10490969/

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