DataContract с наследованием? - PullRequest
       27

DataContract с наследованием?

4 голосов
/ 21 сентября 2011

У меня есть класс со списком объектов, который сериализован и десериализован:

[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.

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011

Вам необходимо поместить атрибут KnownType в Manager:

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

, поскольку это менеджер, имеющий массив BigBase, элементами которого также могут быть производные классы.Таким образом, DataContractSerializer будет знать, что ожидать от массива при сериализации и десериализации объекта Manager (и все это DataMember).

0 голосов
/ 21 сентября 2011
[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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...