如何使用通用属性序列化/反序列化类?

时间:2017-02-09 13:53:12

标签: c# xml generics xml-serialization

我无法对包含通用属性T的类进行反序列化。我得到的例外是:

  

无法生成临时类(result = 1)。错误CS0030:不能   转换类型'老师'到程序员'错误   CS0029:无法隐式转换类型'程序员'至   '教师'

我的班级结构的一个人为的例子是:

[Serializable]
public class Person<T> where T : Profession
{
    [XmlElement("Teacher", typeof(Teacher))]
    [XmlElement("Programmer", typeof(Programmer))]
    public T Profession { get; set; }
}

[Serializable]
[XmlInclude(typeof(Teacher))] // A Subclass
[XmlInclude(typeof(Programmer))] // A Subclass
public class Profession
{}

[Serializable]
public class Teacher : Profession
{
    [XmlElement]
    public int Salary { get; set; }
}


[Serializable]
public class Programmer : Profession
{
    [XmlElement]
    public long MassiveSalary { get; set; }
}

我要反序列化的XML文件的结构是:

<Person>
    <Programmer/>
</Person>

或者可能......

<Person>
    <Teacher />
</Person>

基本上同样的问题被描述为here但是使用的解决方案/解决方法对我没有意义。在这种情况下,解决方法是定义不同类型之间的隐式转换(本例中为Teacher / Programmer)。

最后一点是,如果我注释掉任何一个职业,那么我可以反序列化该文件的至少一个版本。例如:

[Serializable]
public class Person<T> where T : Profession
{
    // Comment out 'Programmer' and I can deserialise all files with a 'Teacher' XMLElement
    [XmlElement("Teacher", typeof(Teacher))]
    //[XmlElement("Programmer", typeof(Programmer))]

    public T Profession { get; set; }
}

然后可以反序列化文件。任何人都可以解释是否有可能这样做,或建议合理的工作量?谢谢。

1 个答案:

答案 0 :(得分:0)

尝试以下xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq; 

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
                "<Root>" +
                   "<Person>" +
                      "<Programmer/>" +
                      "<Teacher/>" +
                   "</Person>" +
                "</Root>";

            XElement root = XElement.Parse(xml);

            string[] persons = root.Descendants("Person").Elements().Select(x => x.Name.LocalName).ToArray();
        }
    }
}