4

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

[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属性,则该属性将被视为一个数组,并且该接口仍然被忽略。OrderManagerISerializableOrderManagerISerializable

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

由于我的包装集合是 typeOrder并且我的AddOrder方法接受了OrderInfo,因此公开它并没有真正起作用ICollection<Order>。无论哪种方式,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;          
}
4

1 回答 1

3

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

这是因为它在检查继承IEnumerable之前检查继承,ISerializable因此它将使用 Enumerable 接口首先拉出对象。

你可以通过实现你自己的合约解析器来覆盖这个行为,继承自DefaultContractResolver这个覆盖:

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

        return base.CreateContract(objectType);
    }

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

于 2012-10-31T21:52:56.050 回答