Восстановление общих переменных между унаследованными типами - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть два класса: GameObject и SampleObject : GameObject и список типа GameObject. Я сериализовал экземпляры этих классов в документ XML. Моя проблема возникает после десериализации (загрузки) этого документа.

В XML-файле экземпляры сериализуются как:

<Root>
 <GameObject>
  <Type>Namespace.MyType</Type>
 </GameObject>
</Root>

Где Тип представляет желаемый тип. И каждый экземпляр сериализуется под тегом GameObject .

После анализа этого документа я получаю список GameObject. Теперь мне нужно восстановить правильный тип:

foreach (GameObject g in myList)
{
  GameObject tempObject = (GameObject)Activator.CreateInstance(Type.GetType(g.TypeString));              
}

Проблема в том, что tempObject пусто (что правильно). Я хотел бы (с некоторыми сокращениями) восстановить общие (общие) переменные между g и tempObject. Пример:

tempObject.Property1 = g.Property1
tempObject.Property2 = g.Property2

1 Ответ

0 голосов
/ 19 ноября 2018

XmlSerializer поддерживает полиморфизм, но вам нужно будет заранее указать, какие типы вывести. Вы можете сделать это, используя атрибут базового типа:

[XmlInclude(typeof(SampleObject))]
public class GameObject
{
}

Вы также можете передать эти типы в конструктор XmlSerializer, например, если у вас нет класса GameObject. Полный пример:

Root root = new Root();
root.Objects.Add(new GameObject { Property1 = 2 });
root.Objects.Add(new SampleObject { Property1 = 5, Property2 = 12 });

XmlSerializer ser = new XmlSerializer(typeof(Root), new Type[] { typeof(SampleObject) });
using (MemoryStream stream = new MemoryStream())
{
    ser.Serialize(stream, root);
    stream.Position = 0;
    Root deserialized = (Root)ser.Deserialize(stream);
}

Выводит следующий xml:

<?xml version="1.0"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <GameObject>
    <Property1>2</Property1>
  </GameObject>
  <GameObject xsi:type="SampleObject">
    <Property1>5</Property1>
    <Property2>12</Property2>
  </GameObject>
</Root>

Я использовал следующие классы для этого примера:

[XmlRoot]
public class Root
{
    public Root()
    {
        Objects = new List<GameObject>();
    }

    [XmlElement("GameObject")]
    public List<GameObject> Objects { get; set; }
}

public class GameObject
{
    public int Property1 { get; set; }
}

public class SampleObject : GameObject
{
    public int Property2 { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...