我正在使用XML作为当前正在使用的C#应用程序的配置格式。为了避免每当我进行一些小改动时都手动维护XSD和XML,我决定创建一堆序列化类来为我做所有处理。现在,由于.NET提供的xsd
工具似乎忽略了某些事情(例如,唯一值的定义),因此我试图将所有内容从模式移至C#代码。
在XSD中,定义了以下xs:complexType
类型:
<xs:complexType name="ServiceType">
<xs:attribute name="uri" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Service1" />
<xs:enumeration value="Service2" />
<xs:enumeration value="Service3" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
然后在以下xs:element
中使用该类型:
<xs:element name="Services">
<xs:complexType>
<xs:sequence>
<xs:element name="Service" type="ServiceType"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="unique-serviceUri">
<xs:selector xpath="Service" />
<xs:field xpath="@uri" />
</xs:unique>
</xs:element>
如您所见,来自uri
的{{1}}属性被定义为唯一。枚举用于限制可能的值,而唯一性用于确保值不会出现多次。
我刚刚发现ServiceType
很容易在C#中序列化:
Enum
现在的问题是,我不仅要限制值,而且使像以前的架构中一样无法多次使用[Serializable]
public class Service
{
public Service()
{
this.uri = ServiceUri.Invalid;
}
public enum ServiceUri
{
Service1,
Service2,
Service3,
[NonSerialized]
Invalid
};
[XmlAttribute("uri")]
public ServiceUri uri { get; set; }
}
。
关于序列化,我经验很少。这看起来很像Service1
的情况,但我不知道如何将其合并到C#中,以便序列化产生我一开始就发布的XSD代码段。这会在实际上包含Dictionary
元素列表的类中发生:
Service