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

本文关键字:对象 ISerializable 类型 集合类 NET 集合 JSON | 更新日期: 2023-09-27 18:33:38

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

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

我可以序列化客户,但忽略OrderManager上的ISerializable接口。如果我从OrderManager中删除 JsonObject 属性(可能是阻止使用ISerializable的原因),则OrderManager被视为数组,ISerializable接口仍被忽略。

我尝试使用ICollection而不是IEnumerable:JSON.NET 无法反序列化包装的集合

由于我的包装集合是 Order 类型,而我的 AddOrder 方法采用OrderInfo,因此公开ICollection<Order>并没有真正起作用。无论哪种方式,ISerializable接口都被忽略了。

有什么解决方法吗?

更新

只是为了澄清我确实将忽略序列化接口设置为 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;          
}

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

这个答案可能很晚,但是:

这是因为它会先检查IEnumerable的继承,然后再检查ISerializable的继承,因此它将使用 Enumerable 接口首先拉出对象。

您可以通过使用此覆盖实现自己的协定解析程序从DefaultContractResolver继承来覆盖此行为:

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

最好使用一些更好的逻辑,但这在根目录下会导致实现ISerializable的对象和IEnumerable首先使用 ISerializedable 实现。