我有一個包裹列表,看起來像這樣: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
接口將被忽略。如果我刪除從OrderManager
的JsonObject
屬性(大概是什麼阻止ISerializable
被使用)OrderManager
被視爲陣列和ISerializable
接口仍然忽略。
我嘗試使用ICollection
代替IEnumerable
: JSON.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;
}
您是否嘗試過'_orders'的實例移動到'Customer'構造? – scottm
剛剛嘗試過。在OrderManager上有和沒有JsonObject屬性時,ISerializable仍然被忽略。 – mbursill
只要添加'[Serializable]'屬性並使'[JsonObject()]'的構造函數爲空就好奇。我在JSON.NET文檔網站上閱讀了這篇文章,並且想知道是否存在衝突。根據文檔,'Serializable'屬性與'JsonObject(MemberSerialization.Fields)'具有相同的效果。 –