lio*_*far 13 c# xml inheritance serialization
我有两个类:基类名称Component和名为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;
}
}
Run Code Online (Sandbox Code Playgroud)
}
我想从Xml文件读取\ write.我知道我需要实现DBComponent类的序列化,否则它将无法读取它.但我找不到任何简单的文章.我发现的所有文章对于这个简单的场景来说太复杂了.
Xml文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<ComponentsCollection>
<Components>
<DBComponent Name="Tenant Historical Database" Description="Tenant Historical Database">
<SPFiles>
<SPFile>Setup\TenantHistoricalSP.sql</SPFile>
</SPFiles>
</DBComponent>
<Component Name="Agent" Description="Desktop Agent" />
</Components>
</ComponentsCollection>
Run Code Online (Sandbox Code Playgroud)
有人可以给我一个简单的例子来说明如何阅读这种xml文件以及应该实现什么?
谢谢
Lior
akt*_*ton 15
不幸的是,您需要告诉XmlSerializer要使用该XmlArrayItem()属性序列化或反序列化的类.每种不同的类型也需要自己的元素名称.例如:
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
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这将读取一个XML文件,如:
<?xml version="1.0" encoding="utf-8" ?>
<ComponentsCollection>
<Components>
<ComponentDerivedClass1>
<!-- ... -->
</ComponentDerivedClass1>
<ComponentDerivedClass2>
<!-- ... -->
</ComponentDerivedClass2>
<ComponentDerivedClass3>
<!-- ... -->
</ComponentDerivedClass3>
</Components>
</ComponentsCollection>
Run Code Online (Sandbox Code Playgroud)
可以存在每个元素的多个实例(或者不存在).
Mar*_*ell 10
不同scenrios的两个选项:告诉基类
[XmlInclude(typeof(DBComponent))]
public class Component
{
private string name = string.Empty;
private string description = string.Empty;
}
Run Code Online (Sandbox Code Playgroud)
或者:告诉收藏:
[XmlArray]
[XmlArrayItem("Component", typeof(Component))]
[XmlArrayItem("DBComponent", typeof(DBComponent))]
public List<Component> Components {...}
Run Code Online (Sandbox Code Playgroud)
实际上,如果您不想要外部节点(Components),也可以使用[XmlElement(...)]代替[XmlArrayItem].另外:您不需要[Serializable].