these release notesによると、Json.NETは今SerializableAttributeをサポートしています。なぜJson.NETのシリアル化は[シリアル化可能]で、ラムダは読み取り専用のプロパティで失敗するのですか?
Json.NETは今SerializableAttributeを持っているタイプを検出し、その種類にすべてのフィールドをシリアル化し、パブリックとプライベートの両方、およびプロパティを無視します。
私はJsonSerializationException
をスローし、次のサンプルコードがあります。
'ConsoleApplication1.MyType' オン 'CS $ <> 9__CachedAnonymousMethodDelegate1' から取得時にエラーが発生しました値を。
私がTotalWithLambdaプロパティにコメントすると、シリアライズは正常に成功します。実際に、私は次のような結果を得る:
- まま[直列化]を、TotalWithLambdaを残す:JsonSerializationException
- まま[直列化]をスローし、TotalWithLambdaを削除:だけ
- がままに、[直列化]を削除 "はmyList" をシリアライズTotalWithLambdaは: "はmyList"、 "トータル"、および "TotalWithLambda"
- 削除[直列化]をシリアライズし、TotalWithLambdaを削除することは:私は番目のすべてを理解して "はmyList" と "合計"
をシリアライズ最初のもの以外の場合。 [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); } }
}
}
[JsonObject]属性を追加するには、私のために働きました。 – shookdiesel