根据这些发行说明,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] 和带有 lambda 的只读属性的组合会导致此异常?
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); } }
}
}