Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON.NET忽略集合类型对象上的ISerializable_C#_Json.net - Fatal编程技术网

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

C# JSON.NET忽略集合类型对象上的ISerializable,c#,json.net,C#,Json.net,我有一个包装列表,如下所示: [JsonObject(MemberSerialization.Fields)] public class OrderManager : IEnumerable<Order>, ISerializable { public OrderManager() { } private List<Order> orders = new List<Order>(); public void AddOrder

我有一个包装列表,如下所示:

[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

由于我的包装集合属于
Order
类型,并且我的
AddOrder
方法接受
OrderInfo
,因此公开
ICollection
实际上不起作用。不管是哪种方式,都忽略了
ISerializable
接口

有什么解决办法吗

更新

为了澄清,我确实将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;          
}

这个答案可能很晚,但:

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

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

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

        return base.CreateContract(objectType);
    }

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

您是否尝试过将
\u orders
的实例化移动到
Customer
构造函数中?只是尝试过。无论OrderManager上是否有JsonObject属性,ISerializable仍然被忽略。如果添加
[Serializable]
属性并使
[JsonObject()]
的构造函数为空,那就奇怪了。我在JSON.NET文档网站上读到了这一点,我想知道是否发生了冲突。根据文档说明,
Serializable
属性与
JsonObject(MemberSerialization.Fields)
具有相同的效果。