2012-05-08 83 views
2

我有一個包裹列表,看起來像這樣:JSON.NET忽略了ISerializable的集合類型的對象

[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接口將被忽略。如果我刪除從OrderManagerJsonObject屬性(大概是什麼阻止ISerializable被使用)OrderManager被視爲陣列和ISerializable接口仍然忽略。

我嘗試使用ICollection代替IEnumerableJSON.NET cannot deserialize a wrapped collection

由於我的包裹收集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;   
} 
+0

您是否嘗試過'_orders'的實例移動到'Customer'構造? – scottm

+0

剛剛嘗試過。在OrderManager上有和沒有JsonObject屬性時,ISerializable仍然被忽略。 – mbursill

+0

只要添加'[Serializable]'屬性並使'[JsonObject()]'的構造函數爲空就好奇。我在JSON.NET文檔網站上閱讀了這篇文章,並且想知道是否存在衝突。根據文檔,'Serializable'屬性與'JsonObject(MemberSerialization.Fields)'具有相同的效果。 –

回答

3

這個答案可能會晚點,但是:

這是因爲檢查的ISerializable繼承,以便它會使用枚舉接口到了第一拉對象之前檢查的IEnumerable繼承。

您可以通過實現自己的合同,解析器從DefaultContractResolver繼承與此重寫覆蓋此行爲:

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

     return base.CreateContract(objectType); 
    } 
有一些更好的邏輯

最好,但是這在根將導致實施ISerializableIEnumerable使用對象首先是ISerializable實現。