Любой хороший пример того, как сериализовать список общих объектов с абстрактным базовым классом. Образцы с не абстрактным базовым классом перечислены в XML Serialize generic list of serializable objects. Мой базовый класс похож на Microsoft.Build.Utilities.TaskXML Сериализовать общий список сериализуемых объектов с абстрактным базовым классом
ответ
Часто бывает полезно иметь абстрактные классы с несколькими производными типами, позволяющие использовать строго типизированные списки и такие.
Например, у вас может быть класс DocumentFragment, который является абстрактным и двумя конкретными классами, называемыми TextDocumentFragment и CommentDocumentFragment (этот пример из Willis).
Это позволяет создать свойство List, которое может содержать объекты только этих двух типов.
При попытке создать WebService, который возвращает этот список, вы получите сообщение об ошибке, но это легко обойти на код ниже ....
[Serializable()]
[System.Xml.Serialization.XmlInclude(typeof(TextDocumentFragment))]
[System.Xml.Serialization.XmlInclude(typeof(CommentDocumentFragment))]
public abstract class DocumentFragment {
...}
The XmlInclude атрибуты говорят ученикам, что он может быть сериализованы для этих двух производных классов.
Это генерирует атрибут в элементе DocumentFragment, определяющий фактический тип, как показано ниже.
<DocumentFragment xsi:type="TextDocumentFragment">
Любые дополнительные свойства, относящиеся к производному классу, также будут включены с использованием этого метода.
Другой альтернативой является использование XmlElementAttribute
, чтобы переместить список известных типов в самом общий список ...
using System;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;
public abstract class Animal
{
public int Weight { get; set; }
}
public class Cat : Animal
{
public int FurLength { get; set; }
}
public class Fish : Animal
{
public int ScalesCount { get; set; }
}
public class AnimalFarm
{
[XmlElement(typeof(Cat))]
[XmlElement(typeof(Fish))]
public List<Animal> Animals { get; set; }
public AnimalFarm()
{
Animals = new List<Animal>();
}
}
public class Program
{
public static void Main()
{
AnimalFarm animalFarm = new AnimalFarm();
animalFarm.Animals.Add(new Cat() { Weight = 4000, FurLength = 3 });
animalFarm.Animals.Add(new Fish() { Weight = 200, ScalesCount = 99 });
XmlSerializer serializer = new XmlSerializer(typeof(AnimalFarm));
serializer.Serialize(Console.Out, animalFarm);
}
}
... что также приведет к лучше выглядящим вывод XML (без уродливого xsi:type
)
<?xml version="1.0" encoding="ibm850"?>
<AnimalFarm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Cat>
<Weight>4000</Weight>
<FurLength>3</FurLength>
</Cat>
<Fish>
<Weight>200</Weight>
<ScalesCount>99</ScalesCount>
</Fish>
</AnimalFarm>
, если вы не сохранили элемент Animals, вместо этого вы можете использовать XmlArrayItemAttribute. – Console
- 1. @classmethod с абстрактным базовым классом
- 2. Использование MEF с абстрактным базовым классом
- 3. Сопоставьте несколько объектов с абстрактным базовым классом или интерфейсом EF4?
- 4. C# runtime полиморфизм с абстрактным базовым классом
- 5. Доктрина Наследование Картирование с абстрактным базовым классом
- 6. Декоратор с базовым базовым классом
- 7. C# XML Сериализация с абстрактным классом
- 8. Использование наследования классов с абстрактным базовым классом, поддерживающим контейнер
- 9. Проблема Automapper с абстрактным базовым классом в версии 4.0.X
- 10. Оказание контроля пользователя с абстрактным базовым классом во время разработки
- 11. Пул фабрик для классов с абстрактным базовым классом
- 12. Оператор ++ (int) перегрузка с абстрактным базовым классом и стеной
- 13. Как сериализовать общий список?
- 14. Сортировка с абстрактным классом
- 15. XML Deserialization не работает с абстрактным классом
- 16. Как XML-сериализация дочернего класса с его базовым классом
- 17. Как использовать список инициализации с базовым классом?
- 18. Использование MEF с базовым базовым классом
- 19. Работа с абстрактным классом
- 20. Интерфейс с абстрактным классом
- 21. OO Pattern: общая работа между абстрактным базовым классом и подклассами
- 22. Как сериализовать список объектов
- 23. Сериализовать список настраиваемых объектов
- 24. MVC View Scaffolding не работает с базовым базовым классом?
- 25. Приставка свойства с базовым классом
- 26. Сортировка списков с абстрактным классом
- 27. Пример инъекции зависимостей с базовым классом
- 28. WCF Сериализация с абстрактным классом
- 29. Невозможно сериализовать список объектов (каждый объект содержит список) в xml
- 30. Xml Сериализовать список потомков
Согласен с @Dmitry. Альтернативный ответ можно найти в разделе Сериализация без XmlInclude http://stackoverflow.com/questions/370291/serializing-without-xmlinclude – walter