【问题标题】:DataContract with inheritance?具有继承的DataContract?
【发布时间】:2011-09-21 15:36:38
【问题描述】:

我有一个带有序列化和反序列化对象列表的类:

[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 类,但每个 Medium 和 Small 类都没有正确的 isMoving 值。

【问题讨论】:

  • 没有一些示例测试代码我怀疑有人会想帮助你。

标签: c# inheritance datacontract known-types


【解决方案1】:

你需要在Manager上加上KnownType属性:

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

因为它的 Manager 有一个 BigBase 数组,其元素也可能是派生类。所以DataContractSerializer 将知道在序列化和反序列化Manager 对象(而且都是DataMember)时对数组的期望。

【讨论】:

    【解决方案2】:
    [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);
    

    【讨论】:

      猜你喜欢
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多