XmlSerializer - 必需的元素
Posted
技术标签:
【中文标题】XmlSerializer - 必需的元素【英文标题】:XmlSerializer - required elements 【发布时间】:2012-02-23 08:21:15 【问题描述】:我将 XmlSerializer 用于 WCF 服务(就我的服务而言,这是有原因的)。但是最近我遇到了一个问题:我找不到一种简单的方法来使引用类型属性成为必需,即使其在 XSD 中的定义如下所示:
<xs:element minOccurs="1" maxOccurs="1" name="Name" type="xs:string"/>
而不是这个:
<xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string"/>
这里是属性代码:
[XmlElement]
public string Name get; set;
我知道使用 DataContractSerializer 我可以做到这一点:
[DataMember(IsRequired = true)]
public string Name get; set;
我会得到想要的架构。
任何想法如何通过 XmlSerializer 属性获得类似于 IsRequired 的功能?
谢谢。
【问题讨论】:
【参考方案1】:使用
[XmlElement(IsNullable=true)]
即使为 null,也应强制对成员进行序列化,使其 minOccurs 为 1(我认为 - 尚未检查)。
【讨论】:
你说得对,它确实在 xsd 中将 minOccurs 设置为 1,但它还为 xs:element 添加了 nillable="true" 属性。我想要的是保证没有这个元素的客户端消息不会被服务接受,所以我不必检查相应的属性是否为空。 我不认为您可以获得默认的 xml 序列化程序来强制元素,而不需要额外的属性。是否可以选择实现 IXmlSerializable 以便您可以完全自定义生成的 xml?【参考方案2】:要走的路是手动创建或编辑 XSD,然后使用验证 XmlReader 作为 XmlSerializer 的输入。
【讨论】:
以上是关于XmlSerializer - 必需的元素的主要内容,如果未能解决你的问题,请参考以下文章
C#中通过XmlSerializer类反序列化多个同名XML元素
如何使用 XmlSerializer 类对象将具有相同名称的 2 个子元素组合成单个属性是 C#
C# Xmlserializer 将列表反序列化为 0 而不是 null