【问题标题】:Why I could not serialize a tuple in C#? [duplicate]为什么我不能在 C# 中序列化元组? [复制]
【发布时间】:2012-11-24 05:31:23
【问题描述】:

可能重复:
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] 无法序列化,因为它没有无参数构造函数。

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

【问题讨论】:

标签: c# serialization tuples


【解决方案1】:

为了让XmlSerializer 能够完成它的工作,它需要一个默认的构造函数。那是一个不带参数的构造函数。所有Tuple&lt;...&gt; 类都有一个构造函数,并且该构造函数接受多个参数。元组中的每个值一个。所以在你的情况下,唯一的构造函数是

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

【讨论】:

  • 非常感谢!
【解决方案2】:

异常告诉您:Tuple&lt;T1, T2&gt; 没有序列化程序所需的无参数构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2017-04-26
    • 2015-02-09
    相关资源
    最近更新 更多