これらのリリース ノートによると、Json.NET は SerializableAttribute をサポートするようになりました。
Json.NET は、SerializableAttribute を持つ型を検出し、その型のすべてのフィールド (パブリックとプライベートの両方) をシリアル化し、プロパティを無視するようになりました。
をスローする次のサンプル コードがありますJsonSerializationException
。
「ConsoleApplication1.MyType」の「CS$<>9__CachedAnonymousMethodDelegate1」から値を取得中にエラーが発生しました。
TotalWithLambda プロパティにコメントを付けると、シリアル化は期待どおりに成功します。実際、次の結果が得られます。
- [Serializable] のまま、TotalWithLambda のまま: JsonSerializationException をスロー
- [Serializable] のまま、TotalWithLambda を削除: 「myList」のみをシリアル化します
- [Serializable] を削除し、TotalWithLambda を残す: "myList"、"Total"、および "TotalWithLambda" をシリアル化します。
- [Serializable] を削除し、TotalWithLambda を削除: 「myList」と「Total」をシリアル化します
最初のケースを除いて、これらすべてのケースを理解しています。[Serializable] とラムダを含む読み取り専用プロパティの組み合わせでこの例外が発生するのはなぜですか?
namespace ConsoleApplication1
{
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
class Program
{
static void Main(string[] args)
{
var foo = new MyType();
foo.myList = new List<int>() { 0, 1, 2, 3 };
var returnVal = JsonConvert.SerializeObject(foo);
Console.WriteLine("Return: " + returnVal.ToString());
Console.ReadKey();
}
}
[Serializable]
class MyType
{
public IList<int> myList;
public int Total { get { return this.myList.Sum(); } }
public int TotalWithLambda { get { return this.myList.Sum(x => x); } }
}
}