For XmlSerializer
为了能够完成它的工作,它需要一个默认的构造函数。这是一个不带参数的构造函数。一切Tuple<...>
类有一个构造函数,并且该构造函数接受多个参数。元组中的每个值一个。所以在你的情况下唯一的构造函数是
Tuple(T1 value1, T2 value2)
序列化器正在寻找不带参数的构造函数,并且因为找不到它,所以您会得到异常。
您可以创建一个可变类,它可以替换元组以实现序列化
class MyTuple<T1, T2>
{
MyTuple() { }
public T1 Item1 { get; set; }
public T2 Item2 { get; set; }
public static implicit operator MyTuple<T1, T2>(Tuple<T1, T2> t)
{
return new MyTuple<T1, T2>(){
Item1 = t.Item1,
Item2 = t.Item2
};
}
public static implicit operator Tuple<T1, T2>(MyTuple<T1, T2> t)
{
return Tuple.Create(t.Item1, t.Item2);
}
}
然后您可以按以下方式使用它
XmlSerializer formatter = new XmlSerializer(
typeof(List<List<MyTuple<String, CodeExtractor.StatementNode>>>));
formatter.Serialize(fs, results.SelectMany(
lst => lst.Select(
t => (MyTuple)t
).ToList()
).ToList());