Ответ 1
Для 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());