C# JSON.NET忽略集合类型对象上的ISerializable
我有一个包装列表,如下所示:C# JSON.NET忽略集合类型对象上的ISerializable,c#,json.net,C#,Json.net,我有一个包装列表,如下所示: [JsonObject(MemberSerialization.Fields)] public class OrderManager : IEnumerable<Order>, ISerializable { public OrderManager() { } private List<Order> orders = new List<Order>(); public void AddOrder
[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
:
由于我的包装集合属于Order
类型,并且我的AddOrder
方法接受OrderInfo
,因此公开ICollection
实际上不起作用。不管是哪种方式,都忽略了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;
}
这个答案可能很晚,但: 这是因为它先检查
IEnumerable
的继承,然后再检查ISerializable
的继承,因此它将使用Enumerable接口首先拉出对象
您可以通过使用此覆盖实现您自己的从DefaultContractResolver
继承的契约解析程序来覆盖此行为:
protected override JsonContract CreateContract(Type objectType)
{
if (typeof(ISerializable).IsAssignableFrom(objectType))
return CreateISerializableContract(objectType);
return base.CreateContract(objectType);
}
最好使用一些更好的逻辑,但这会导致实现
ISerializable
和IEnumerable
的对象首先使用ISerializable实现。您是否尝试过将\u orders
的实例化移动到Customer
构造函数中?只是尝试过。无论OrderManager上是否有JsonObject属性,ISerializable仍然被忽略。如果添加[Serializable]
属性并使[JsonObject()]
的构造函数为空,那就奇怪了。我在JSON.NET文档网站上读到了这一点,我想知道是否发生了冲突。根据文档说明,Serializable
属性与JsonObject(MemberSerialization.Fields)
具有相同的效果。