【问题标题】:Object serialization and derived classes; controlling xml output对象序列化和派生类;控制xml输出
【发布时间】:2011-04-29 13:16:06
【问题描述】:

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

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

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

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

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

我使用的示例代码如下。

[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; }
    }

【问题讨论】:

  • (这里不需要[Serializable],顺便说一句)
  • 是的,不小心将它们包含在一些半连贯的 Ctrl-V 操作中。

标签: c# xml serialization


【解决方案1】:

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

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

【讨论】:

  • 效果很好!甚至不需要基类上的 XmlInclude 属性。
  • @MoSlo,这是另一个与此问题相关的thread on SO
  • 好的,遇到了轻微的反序列化问题。未识别的各种类型(列表为零)。我可以尝试使用 XmlSerializer 进行反序列化吗? dawebber,帖子谈到了 XmlSerializer 构造函数,但没有详细说明。我试过 XmlSerializer(Type,Type[]) 没有成功。
  • 是的,您应该使用带有所有使用类型列表的 XmlSerializer(Type,Type[]) 构造函数。这不起作用?
  • 是的,有效。再试一次,是我的错(读取错误的输入)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多