为什么我不能在C#中序列化一个元组?
可能重复:
为什么XML-Serializable类需要一个无参数的构造函数
我试图在我的代码中序列化一个元组:
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();
但它是失败的,并抓住这样的例外:
System.Tuple`2 [System.String,CodeExtractor.StatementNode]不能被序列化,因为它没有无参数的构造函数。
我确信CodeExtractor.StatementNode
可以被序列化。
为了使XmlSerializer
能够完成它的工作,它需要一个默认的构造器。 这是一个不带任何参数的构造函数。 所有的Tuple <…>类都有一个构造函数,而构造函数需要一些参数。 一个用于元组中的每个值。 所以在你的情况下,唯一的构造函数是
Tuple(T1 value1, T2 value2)
序列化程序正在寻找一个没有参数的构造函数,因为找不到它,你会得到exception。
你可以创build一个可以replace元组的序列化的可变类
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());
正如exception告诉你: Tuple<T1, T2>
没有无参数的构造函数,这是串行器所需要的。