Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有继承权的数据契约?_C#_Inheritance_Datacontract_Known Types - Fatal编程技术网

C# 有继承权的数据契约?

C# 有继承权的数据契约?,c#,inheritance,datacontract,known-types,C#,Inheritance,Datacontract,Known Types,我有一个类,其中包含序列化和反序列化的对象列表: [DataContract] public class Manager { [DataMember] public BigBase[] enemies; } 包含子类的类: [DataContract] [KnownType(typeof(Medium))] [KnownType(typeof(Small))] public class BigBase { [DataMember] public bool isMovin

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

[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值。

您需要在
管理器上设置
KnownType
属性:

[DataContract]
[KnownType(typeof(Medium))]
[KnownType(typeof(Small))]
public class Manager
{
  [DataMember]
  public BigBase[] enemies;
}
因为管理器有一个
BigBase
数组,其元素也可能是派生类。因此,
DataContractSerializer
将知道在序列化和反序列化
Manager
对象时从数组中期望得到什么(并且都是
DataMember

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

电话样本:

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);
如果没有一些示例测试代码,我怀疑是否有人愿意帮助您。
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);