コレクションが型として表されるオブジェクトモデルにjsonを逆シリアル化しようとしていIList<T>
ます。
実際の逆シリアル化はここにあります:
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Deserialize<IList<Contact>>(
(new StreamReader(General.GetEmbeddedFile("Contacts.json")).ReadToEnd()));
例外を投稿する前に、暗黙の変換が何であるかを知っておく必要があります。これはContact
タイプです:
public class Contact
{
public int ID { get; set; }
public string Name { get; set; }
public LazyList<ContactDetail> Details { get; set; }
//public List<ContactDetail> Details { get; set; }
}
そしてこれはContactDetail
タイプです:
public class ContactDetail
{
public int ID { get; set; }
public int OrderIndex { get; set; }
public string Name { get; set; }
public string Value { get; set; }
}
で知っておくべき重要なことLazyList<T>
は、それが実装しているということIList<T>
です:
public class LazyList<T> : IList<T>
{
private IQueryable<T> _query = null;
private IList<T> _inner = null;
private int? _iqueryableCountCache = null;
public LazyList()
{
this._inner = new List<T>();
}
public LazyList(IList<T> inner)
{
this._inner = inner;
}
public LazyList(IQueryable<T> query)
{
if (query == null)
throw new ArgumentNullException();
this._query = query;
}
LazyList<T>
これで、 Jsonを逆シリアル化しようとするまで、このクラス定義は問題ありませんでした。は、その年齢の意味のあるSystem.Web.Script.Serialization.JavaScriptSerializer
リストをシリアル化したいと思っているようですが、それらが私の中にキャストされるように、タイプでそれらが必要です(少なくともそれは私が間違っていると思うところです)。List<T>
IList<T>
LazyList<T>
この例外が発生します:
System.ArgumentException: Object of type 'System.Collections.Generic.List`1[ContactDetail]' cannot be converted to type 'LazyList`1[ContactDetail]'..
List<ContactDetail>
私が私のタイプで使用しようとするContact
と(上記のコメントを見ることができるように)、それはうまくいくようです。しかし、私はを使いたくありませんList<T>
。LazyList<T>
実行しているように見える継承を試してみましたが、内部を実装にList<T>
渡すのは悪夢であり、モデルのどこにも肥大化したくないだけです。List<T>
T[]
List<T>
また、他のいくつかのjsonライブラリを無駄に試しました(これらを最大限に活用していない可能性があります。多かれ少なかれ参照を置き換えて、この質問の上部に引用されているコードを繰り返してみました。おそらく、settingsparamsを渡すとヘルプ??)。
今何をしようかわからない。別のデシリアライザーを使用しますか?デシリアライズ自体を微調整しますか?デシリアライザーを満足させるためにタイプを変更する必要がありますか?暗黙のキャストについてもっと心配する必要がありますか、それとも単に別のインターフェイスを実装する必要がありますか?