use*_*322 18 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);
XmlSerializer formatter = new XmlSerializer(
typeof(List<List<Tuple<String, CodeExtractor.StatementNode>>>));
formatter.Serialize(fs, results);
fs.Close();
Run Code Online (Sandbox Code Playgroud)
但它失败了并捕获这样的异常:
System.Tuple`2 [System.String,CodeExtractor.StatementNode]不能序列化,因为它没有参数的构造函数.
而且我确定CodeExtractor.StatementNode可以序列化.
Run*_* FS 26
为了XmlSerializer能够完成它的工作,它需要一个默认的构造函数.这是一个不带参数的构造函数.所有Tuple <...>类都有一个构造函数,该构造函数需要许多参数.一个元组中的每个值.所以在你的情况下,唯一的构造函数是
Tuple(T1 value1, T2 value2)
Run Code Online (Sandbox Code Playgroud)
序列化程序正在寻找没有参数的构造函数,因为它无法找到它,所以你得到了异常.
你可以创建一个可变类,它可以代替元组用于序列化
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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过以下方式使用它
XmlSerializer formatter = new XmlSerializer(
typeof(List<List<MyTuple<String, CodeExtractor.StatementNode>>>));
formatter.Serialize(fs, results.SelectMany(
lst => lst.Select(
t => (MyTuple)t
).ToList()
).ToList());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19619 次 |
| 最近记录: |