Как реализовать сериализацию Xml с унаследованными классами в C#
у меня есть два класса: компонент имени базового класса и класс inheritd с именем DBComponent
[Serializable]
public class Component
{
private string name = string.Empty;
private string description = string.Empty;
}
[Serializable]
public class DBComponent : Component
{
private List<string> spFiles = new List<string>();
// Storage Procedure Files
[XmlArrayItem("SPFile", typeof(string))]
[XmlArray("SPFiles")]
public List<string> SPFiles
{
get { return spFiles; }
set { spFiles = value; }
}
public DBComponent(string name, string description)
: base(name, description)
{ }
}
[Serializable]
public class ComponentsCollection
{
private static ComponentsCollection instance = null;
private List<Component> components = new List<Component>();
public List<Component> Components
{
get { return components; }
set
{
components = value;
}
}
public static ComponentsCollection GetInstance()
{
if (ccuInstance == null)
{
lock (lockObject)
{
if (instance == null)
PopulateComponents();
}
}
return instance;
}
private static void PopulateComponents()
{
instance = new CCUniverse();
XmlSerializer xs = new XmlSerializer(instance.GetType());
instance = xs.Deserialize(XmlReader.Create("Components.xml")) as ComponentsCollection;
}
}
}
Я хочу читатьписать из XML-файла. Я знаю, что мне нужно реализовать сериализацию для класса DBComponent, иначе он не будет ее читать.Но я не могу найти для этого простой статьи. все статьи, которые я нашел, были слишком сложными для этого простого сценария.
Xml-файл выглядит следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<ComponentsCollection>
<Components>
<DBComponent Name="Tenant Historical Database" Description="Tenant Historical Database">
<SPFiles>
<SPFile>SetupTenantHistoricalSP.sql</SPFile>
</SPFiles>
</DBComponent>
<Component Name="Agent" Description="Desktop Agent" />
</Components>
</ComponentsCollection>
может кто-нибудь, пожалуйста, дайте мне простой пример того, как читать этот вид xml-файла и что должно быть реализовано ?
спасибо
Лиор!--3-->
3 ответов
к сожалению, нужно сказать XmlSerializer
классы вы собираетесь сериализовать или десериализовать с помощью . Каждый другой тип также нуждается в собственном имени элемента. Например:
public class ComponentDerviedClass1: Component
public class ComponentDerivedClass2: Component
public class ComponentDerivedClass3: Component
// ...
public class ComponentsCollection
{
[XmlArray("Components")]
[XmlArrayItem("ComponentDerivedClass1", typeof(ComponentDerivedClass1))]
[XmlArrayItem("ComponentDerivedClass2", typeof(ComponentDerivedClass2))]
[XmlArrayItem("ComponentDerivedClass3", typeof(ComponentDerivedClass3))]
public List<Component> Components
{
// ...
}
}
это будет читать XML файл:
<?xml version="1.0" encoding="utf-8" ?>
<ComponentsCollection>
<Components>
<ComponentDerivedClass1>
<!-- ... -->
</ComponentDerivedClass1>
<ComponentDerivedClass2>
<!-- ... -->
</ComponentDerivedClass2>
<ComponentDerivedClass3>
<!-- ... -->
</ComponentDerivedClass3>
</Components>
</ComponentsCollection>
может присутствовать несколько экземпляров каждого элемента (или ни одного).
два варианта для разных scenrios: скажите базового класса
[XmlInclude(typeof(DBComponent))]
public class Component
{
private string name = string.Empty;
private string description = string.Empty;
}
или: скажите коллекции:
[XmlArray]
[XmlArrayItem("Component", typeof(Component))]
[XmlArrayItem("DBComponent", typeof(DBComponent))]
public List<Component> Components {...}
На самом деле, вы также можете использовать [XmlElement(...)] вместо [XmlArrayItem], если вы не хотите внешний узел (компоненты). Кроме того: вам не нужно [Serializable].
Итак, вы уже реализовали сериализацию классов, насколько я могу видеть из вашего кода? Если вы пытаетесь вернуть объекты из XML-файлов, используйте deserializer:
система.XML.Сериализация.Сериализатор XmlSerializer.Десериализовать
Если не вы, помните, что вы всегда можете создать код из схемы XML