にISerializableを無視します:私はこのような顧客のクラスにフィールドインスタンスを含めるJSON.NETが、私はこのようになります包まれたリスト持っているコレクション型のオブジェクト
[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
(おそらくISerializable
が使用されない原因)からJsonObject
属性を削除すると、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のdocサイトで少し読んでいましたが、何が起きているのか不思議です。 'Serializable'属性は' JsonObject(MemberSerialization.Fields) 'と同じ効果があります。 –