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

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

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

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

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

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

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

15   голосов , оценка 4.067 из 5
Похожие ответы