c# - 为什么我无法在 C# 中序列化元组?

标签 c# serialization tuples

<分区>

Possible Duplicate:
Why XML-Serializable class need a parameterless constructor

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

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] cannot be serialized because it does not have a parameterless constructor.

而且我确信 CodeExtractor.StatementNode 可以序列化。

最佳答案

对于 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());

关于c# - 为什么我无法在 C# 中序列化元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13739348/

相关文章:

c# - 如何在一行中编写以下lambda表达式?

c++ - Boost二进制序列化问题

serialization - Hadoop中的序列化-可写

list - 如何从haskell中的元组列表中获取特定值?

list - 元组的Scala列表在for循环后变为空

java - 如何在一个方法中返回一对对象?

c# - 元编程 : write in one language X, C#、PHP、Java、C 等多种语言交叉编译

c# - 当文本框上的 iframe 控件具有焦点时,如何保持页面的滚动位置?

java - 序列化与字节码翻译

c# - 如何测量页面时间负载?