对象序列化和派生类;控制XML输出

本文关键字:控制 XML 输出 序列化 派生 对象 | 更新日期: 2023-09-27 17:54:19

我有两个派生类,它们将被序列化成xml。
虽然代码工作正常(XmlSerializer,没有什么奇怪的),但DataScenario的序列化使其MyData属性项从基类名称生成Xmlelement名称:

<DataScenario>
  <MyData>
    <ScenarioData/>
    <ScenarioData/>
    <ScenarioData/>
  </MyData>
<DataScenario>

相反,我试图让这些项目产生XmlElement名称从他们的派生类

<DataScenario>
  <MyData>
    <type1/>
    <type1/>
    <type2/>
  </MyData>
<DataScenario>

这可能吗?记住,我也需要反序列化;我不确定Deserialize进程是否会理解需要创建派生对象。

我使用的示例代码如下:

[Serializable]
[XmlInclude(typeof(Type1))]
[XmlInclude(typeof(Type2))]
public class Scenario
    {
        [XmlElement("location")]
        public string Location { get; set; }
        [XmlElement("value")]
        public string Value { get; set; }
        public Scenario()
        {
        }
    }
[Serializable]
[XmlType("type1")]
public class Type1 : Scenario
    {
        public FillPointData() : base() { }            
    }

[Serializable]
[XmlType("type2")]
public class Type2 : Scenario
    {
        public TestData() : base() { }            
    }

//Hosting class of all scenarios
public DataScenario()
    {
        public List<Scenario> MyData{ get; set; }
    }

对象序列化和派生类;控制XML输出

您可以使用XmlArrayItem属性定义集合中的元素类型。如果类型已知(如使用XmlInclude属性定义的那样),它将创建标记"Type1"、"Type2"。如果类型未知,它仍然会创建一个名为ScenarioData的标签,其属性为xsi:type="Type1",用于在反序列化时映射类型。

[XmlArrayItem(typeof(Type1))] 
[XmlArrayItem(typeof(Type2))] 
Public List<Scenario> Children
{
// getter & setter
}