[英]ISerializable and JsonObject/JsonProperty JSON.NET
[英]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
而不是IEnumerable
: JSON.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
,這將導致實現ISerializable
和IEnumerable
對象首先使用ISerializable實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.