私はIEnumerableを実装するコレクションクラスを持っており、同じもののシリアル化されたバージョンをデシリアライズするのに問題があります。私はJson.netのVここで4.0.2.13623IEnumerableを実装したカスタムコレクションのJson.netシリアル化<T>
を使用しています、私は、私は次のようなJSONを取得し、それをシリアル化するとき、私の問題
public class MyType
{
public int Number { get; private set; }
public MyType(int number)
{
this.Number = number;
}
}
public class MyTypes : IEnumerable<MyType>
{
private readonly Dictionary<int, MyType> c_index;
public MyTypes(IEnumerable<MyType> seed)
{
this.c_index = seed.ToDictionary(item => item.Number);
}
public IEnumerator<MyType> GetEnumerator()
{
return this.c_index.Values.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
public int CustomMethod()
{
return 1; // Just for illustration
}
}
を示して私のコレクションクラスのsimplierバージョンです
[
{
"Number": 1
},
{
"Number": 2
}
]
しかし、私はdeserializeしようとすると、私は次の例外が発生します System.Exception:リスト型のMyTypesを作成することができません
もありますリートシリアル化のヒントを使用しますが、私は
public void RoundTrip()
{
var _myTypes1 = new MyTypes(new[] { new MyType(1), new MyType(2) });
var _jsonContent = JsonConvert.SerializeObject(_myTypes1, Formatting.Indented);
var _myTypes2 = JsonConvert.DeserializeObject<MyTypes>(_jsonContent);
}
public void RoundTripWithSettings()
{
var _myTypes1 = new MyTypes(new[] { new MyType(1), new MyType(2) });
var _serializationSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Arrays };
var _jsonContent = JsonConvert.SerializeObject(_myTypes1, Formatting.Indented, _serializationSettings);
var _myTypes2 = JsonConvert.DeserializeObject<MyTypes>(_jsonContent, _serializationSettings);
}
を使用していたテスト機能は誰もが自分自身のコレクションオブジェクトをシリアル化するために管理していますされているいかなる成功
これらを持っていませんでしたか?事前に
おかげ
パット
IEnumerableではなく、リストなどの具体的なコレクションにシリアル化およびデシリアライズする必要があります。デシリアライズするには、単なるインタフェースではなく実装が必要です。 –
Deleted
Chris、ReadOnlyCollectionをサブクラス化する他の変更を加えましたが、コレクションを逆シリアル化することができます –
pmcgrath
実際には、IListを使用することもできます。リストが作成されます。しかし、IEnumerable に定義されている既定のコレクションはありません。 –
Mithon