为什么我不能在C#中序列化元组?

为什么我不能在C#中序列化元组?,c#,serialization,tuples,C#,Serialization,Tuples,可能重复: 我正在尝试序列化代码中的元组: List<List<Tuple<String, CodeExtractor.StatementNode>>> results = null; results = extractor.ExtractSourceCode(sourceCode); FileStream fs = new FileStream(@"C:\Projects\Test\ast.xml", FileMode.Create); XmlSeria

可能重复:

我正在尝试序列化代码中的元组:

List<List<Tuple<String, CodeExtractor.StatementNode>>> results = null;
results = extractor.ExtractSourceCode(sourceCode);
FileStream fs = new FileStream(@"C:\Projects\Test\ast.xml", FileMode.Create);

XmlSerializer formatter = new XmlSerializer(
    typeof(List<List<Tuple<String, CodeExtractor.StatementNode>>>));

formatter.Serialize(fs, results);

fs.Close();
列表结果=null;
结果=提取器.ExtractSourceCode(sourceCode);
FileStream fs=newfilestream(@“C:\Projects\Test\ast.xml”,FileMode.Create);
XmlSerializer格式化程序=新XmlSerializer(
(列表)的类型;
序列化(fs,结果);
fs.Close();
但它失败了,并捕获如下异常:

无法序列化System.Tuple`2[System.String,CodeExtractor.StatementNode],因为它没有无参数构造函数


我确信可以序列化
CodeExtractor.StatementNode

正如异常告诉您的那样:没有序列化程序所需的无参数构造函数。

对于
XmlSerializer
要能够完成其工作,它需要一个默认构造函数。这是一个不带参数的构造函数。所有的
元组
类都有一个构造函数,该构造函数接受许多参数。元组中的每个值对应一个。因此,在您的情况下,唯一的构造函数是

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);
    }
}
类MyTuple
{
MyTuple(){}
公共T1项1{get;set;}
公共T2项2{get;set;}
公共静态隐式运算符MyTuple(Tuple t)
{
返回新的MyTuple(){
Item1=t.Item1,
Item2=t.Item2
};
}
公共静态隐式运算符元组(MyTuple t)
{
返回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());
XmlSerializer格式化程序=新的XmlSerializer(
(列表)的类型;
序列化(fs,results.SelectMany(
lst=>lst.Select(
t=>(MyTuple)t
)托利斯先生()
).ToList());

阅读以下语句:System.Tuple`2[System.String,System.String]无法序列化,因为它没有无参数构造函数。。。很清楚!(参见反编译:)CodeExtractor和StatementNode都可以序列化吗?参见这个问题:非常感谢!