首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承的DataContract?

继承的DataContract?
EN

Stack Overflow用户
提问于 2011-09-21 23:36:39
回答 2查看 6.5K关注 0票数 4

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

代码语言:javascript
复制
[DataContract]
public class Manager
{
  [DataMember]
  public BigBase[] enemies;
}

包含子类的类:

代码语言:javascript
复制
[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值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-21 23:41:39

您需要在Manager上放置KnownType属性

代码语言:javascript
复制
[DataContract]
[KnownType(typeof(Medium))]
[KnownType(typeof(Small))]
public class Manager
{
  [DataMember]
  public BigBase[] enemies;
}

因为它是管理器,它有一个BigBase数组,它的元素也可能是派生类。因此,当序列化和反序列化Manager对象时,DataContractSerializer将知道期望从数组得到什么(并且它都是DataMember)。

票数 3
EN

Stack Overflow用户

发布于 2011-09-22 00:12:29

代码语言:javascript
复制
[DataContract]
public class Medium : BigBase
{
    [DataMember]
    public string UpgradedName;
}

我在这段测试代码中看不到这一点。我认为你的序列化代码是错误的。

示例调用:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7502575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档