簡體   English   中英

JSON.NET忽略集合類型對象上的ISerializable

[英]JSON.NET ignores ISerializable on collection type object

我有一個包裝好的清單,看起來像這樣:

[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被忽略。 如果我從OrderManager刪除JsonObject屬性(可能是阻止使用ISerializable的原因),那么OrderManager將被視為一個數組,並且仍會忽略ISerializable接口。

我嘗試使用ICollection而不是IEnumerableJSON.NET無法反序列化包裝的集合

由於我包裝的集合的類型為Order而我的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;          
}

這個答案可能晚了,但是:

這是因為它在檢查ISerializable繼承之前先檢查IEnumerable的繼承,因此它將使用Enumerable接口首先將對象拉出。

您可以通過實現繼承自DefaultContractResolver的合同解析器來覆蓋此行為:

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

        return base.CreateContract(objectType);
    }

最好使用一些更好的邏輯,但是從根本ISerializable ,這將導致實現ISerializableIEnumerable對象首先使用ISerializable實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM