我无法对包含通用属性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; }
}
然后可以反序列化文件。任何人都可以解释是否有可能这样做,或建议合理的工作量?谢谢。
答案 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();
}
}
}