2015-05-09 99 views
0

我知道那里有很多类似的问题,但仍然经过几个小时的搜索后,我没有找到答案。我希望序列化来自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

回答

0

至于串行而言,它是序列化的类型是Person

序列化时,Person没有DataContact属性,所以这是第一个要解决的问题。

[DataContract]  
abstract class Person 

名单将现在序列化,但是当你来到反序列化则发生类似的问题 - 解串器只知道在Person类型。所述documentation的相关部分说:

被实例化反序列化类型是由第一检查传入消息以确定该消息的内容符合数据契约选择的。反序列化引擎然后尝试查找实现与消息内容兼容的数据契约的CLR类型。在这个过程中,反序列化引擎允许的一组候选类型被称为解串器的一组“已知类型。“

因此,这是你的KnownType属性进来:

[DataContract] 
[KnownType(typeof(Child))] 
abstract class Person 
+0

我的错误是我没有抄这条线,总有是[DataContract]和错误仍然apear但是这最后真的。帮助,谢谢 – Bielik

+0

您是否阅读了我的答案的其余部分?您在错误的类上有'KnownType'属性 –

+0

是的,我刚刚编辑回复,起初没有看到它,我想纠正错误代码asap抱歉你真的帮助了我,再次感谢。如果我只是问,这是我的序列化测试程序,在原始项目中,我有不止一个班级t从Parent继承。我怎样才能在那里工作? – Bielik