繁体   English   中英

DataContract有继承吗?

[英]DataContract with inheritance?

我有一个类,其中包含序列化和反序列化的对象列表:

[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
{
}

现在,当反序列化enemies数组时,它会包含正确反序列化的BigBase类,但每个Medium和Small类都没有正确的isMoving值。

您需要在Manager上放置KnownType属性:

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

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

[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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM