我知道那里有很多类似的问题,但仍然经过几个小时的搜索后,我没有找到答案。我希望序列化来自Person类的字段的Child对象。这里是代码:DataContract序列化(继承)
[DataContract]
abstract class Person
{
[DataMember]
protected int level;
[DataMember]
protected string name;
public Person(int level, string name)
{
this.level = level;
this.name = name;
}
}
[DataContract]
[KnownType(typeof(Child))] //With and without it\\
class Child : Person
{
public Child(int level, string name) : base(level , name) {}
}
class Program
{
static void Main(string[] args)
{
//CREATE OBJECTS
List<Person> p = new List<Person>();
Person p1 = new Child(3, "ned"); p1.Display();
Person p2 = new Child(5, "rob"); p2.Display();
p.Add(p1); p.Add(p2);
//SERIALIZER
var ser = new DataContractSerializer(typeof(List<Person>));
//WRITE
FileStream fs = new FileStream("deep.xml", FileMode.Create);
ser.WriteObject(fs, p);
fs.Close();
//READ
FileStream fs2 = new FileStream("deep.xml", FileMode.Open);
List<Person> a = new List<Person>();
a = (List<Person>)ser.ReadObject(fs2);
}
}
这里是我的问题:
注明为线 “与不为” 的序列化似乎工作好,但我不能反序列化它,我得到“SerializationException”,而这样做:
a = (List<Person>)ser.ReadObject(fs2);
它说,错误是在168列是这里的某个地方:
<Person i:type="Child">
没有那条线我甚至不能序列化。我得到了SerializationException,它说了一些关于意外类型的东西。这个错误来自该行:
ser.WriteObject(fs, p);
有什么我失踪?一些解释说明“有和没有它”的确切线将会受到欢迎。我试图找到答案,但微软网站上的描述不清楚。
我将非常感谢任何帮助。
解决方案: 将[KnownType(typeof(Child))]移动到Person类。在多重继承的情况下,可以使用多个KnowType属性。
链接到文件:https://msdn.microsoft.com/en-us/library/ms730167%28v=vs.110%29.aspx
我的错误是我没有抄这条线,总有是[DataContract]和错误仍然apear但是这最后真的。帮助,谢谢 – Bielik
您是否阅读了我的答案的其余部分?您在错误的类上有'KnownType'属性 –
是的,我刚刚编辑回复,起初没有看到它,我想纠正错误代码asap抱歉你真的帮助了我,再次感谢。如果我只是问,这是我的序列化测试程序,在原始项目中,我有不止一个班级t从Parent继承。我怎样才能在那里工作? – Bielik