2011-09-21 63 views
3

我有对象的列表一类是序列化和反序列化:带继承的DataContract?

[DataContract] 
public class Manager 
{ 
    [DataMember] 
    public BigBase[] enemies; 
} 

与子类:

[DataContract] 
[KnownType(typeof(Medium))] 
[KnownType(typeof(Small))] 
public class BigBase 
{ 
    [DataMember] 
    public bool isMoving; 
} 
[DataContract] 
public class Medium : BigBase 
{ 
} 
[DataContract] 
public class Small: BigBase 
{ 
} 

现在什么奇怪的反序列化的敌人数组将包含正确的反序列化BigBase类时但是每个中等和小类没有isMoving的正确值。

+0

没有一些样品**测试代码**我怀疑有人会想帮你。 – Icarus

回答

2

你需要把KnownType属性上Manager

[DataContract] 
[KnownType(typeof(Medium))] 
[KnownType(typeof(Small))] 
public class Manager 
{ 
    [DataMember] 
    public BigBase[] enemies; 
} 

因为它其中有BigBase一个数组,其元素可能是派生类以及经理。因此DataContractSerializer将知道序列化和反序列化Manager对象(并且全部是DataMember)期望从阵列中得到什么。

0
[DataContract] 
public class Medium : BigBase 
{ 
    [DataMember] 
    public string UpgradedName; 
} 

我没有看到这个测试代码。我认为你的序列化代码是错误的。

样来电:

Manager test = new Manager(); 

      Medium medium = new Medium() {isMoving = true,Name = "medium", UpgradedName = "mediaum name"}; 
      //some items in array 
      test.enemies = new BigBase[] {medium,new Small{isMoving = false},new Small{isMoving = true}, new BigBase {Name = "bigbase", isMoving = true}, new BigBase {Name = "bigbase2", isMoving = true}, new BigBase {Name = "bigbase3", isMoving = true}} ; 

      DataContractSerializer serializer = new DataContractSerializer(typeof (Manager)); 
      FileStream writer = new FileStream("test123.txt", FileMode.Create); 
      serializer.WriteObject(writer, test); 
      writer.Close(); 
      writer = new FileStream("test123.txt", FileMode.Open); 
      Manager deserializedmanager = serializer.ReadObject(writer) as Manager; 
      //verify serialized object 
      Console.WriteLine("medium object:"+ (deserializedmanager.enemies[0] as Medium).UpgradedName);