如何在xml和xsd上表示多态列表?

时间:2016-09-12 09:42:04

标签: c# xml xsd xmlserializer

我想基于xsd创建一个xml,它将在运行时使用XmlSerializerStreamReader加载到C#对象中。

我的C#对象应具有此示例中的结构:

class Repository {
   public string Name { get; set; }
   public List<IPerson> Persons { get; set; }
}

interface IPerson {
   int ID { get; set; }
}

class Student : IPerson { 
   int ID { get; set; }  
   string Faculty { get; set; }
}

class Fireman : IPerson { 
   int ID { get; set; }  
   bool IsOfficer { get; set; }
}

class Giant : IPerson { 
   int ID { get; set; }  
   int Height { get; set; }
}

我希望能够在xml上放置IPerson的不同实现,并在运行时将它们加载到正确的类型中。

我理解如何在xsd中定义抽象类型和扩展类型。

<xs:complexType abstract="true" name="IPerson">
  <xs:attribute name="ID" type="xs:int"/>
</xs:complexType>
<xs:complexType name="Student">
  <xs:complexContent>
    <xs:extension base="IPerson">
      <xs:attribute name="Faculty" type="xs:string" use="required"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:complexType name="Fireman">
  <xs:complexContent>
    <xs:extension base="IPerson">
      <xs:attribute name="IsOfficer" type="xs:boolean" use="required"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:complexType name="Giant">
  <xs:complexContent>
    <xs:extension base="IPerson">
      <xs:attribute name="Height" type="xs:int" use="required"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

如何将多态列表Persons作为Repository类型的一部分在xsd和xml上表示?

0 个答案:

没有答案