Сериализация и десериализация списка интерфейсов - C#

Узнай цену своей работы

Формулировка задачи:

Привет. Есть интерфейс Shape. Есть несколько реализаций этого интерфейса (Sphere, Box etc). Далее есть список этих фигур, объявленный в виде List<Shape> shapeList= new List<Shape>(). Необходимо сериализовать данный list и десериализовать его обратно. Сериализация и десериализация одного конкретного объекта, например, Box, проблем не вызывает, а вот как сериализовать список интерфейсов не понятно. Пробовал сделать так:
Листинг программы
  1. //------
  2. private List<Shape> shapeList = new List<Shape>();
  3. //------
  4. string filePath = "shapes.shp";
  5. var file = File.Create(filePath);
  6. foreach (Shape shape in shapeList)
  7. {
  8. XmlSerializer writer = new XmlSerializer(shape.GetType());
  9. writer.Serialize(file, shape);
  10. }
При этом получаю вот такой xml:
Листинг программы
  1. <?xml version="1.0"?>
  2. <Sphere xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  3. <radius>8</radius>
  4. <description>Шарик</description>
  5. </Sphere>
  6. <?xml version="1.0"?>
  7. <Box xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  8. <a>2</a>
  9. <b>9</b>
  10. <c>2</c>
  11. <description>Фигура</description>
  12. </Box>
  13. <?xml version="1.0"?>
  14. <Sphere xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  15. <radius>8</radius>
  16. <description>Шарик</description>
  17. </Sphere>
Понятное дело на втором вхождении <?xml version="1.0"?> при десериализации вылетает исключение, т.к. как я понимаю сериализовывать список нужно как-то по другому. Если пробовать сериализовать список целиком, а не каждый его объект, то вылетает исключение по поводу того, что интерфейс сериализовать нельзя, что и понятно. Может есть у кого кусок кода для (де)сериализации подобного списка интерфейсов. Нагуглить смог только сериализацию списка конкретных объектов.

Решение задачи: «Сериализация и десериализация списка интерфейсов»

textual
Листинг программы
  1. XmlSerializer writer = new XmlSerializer(typeof(List<IShape>), new Type[] { typeof(Box), typeof(Sphere), typeof(Pyramid) });

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы