在我的代码中,我有以下类来反序列化XML:
public abstract class AssetBase
{
[XmlAttribute] public string Name { get; set; }
[XmlAttribute] public float RelativeX { get; set; }
[XmlAttribute] public float RelativeY { get; set; }
[XmlAttribute] public float RelativeZ { get; set; }
[XmlAttribute] public float ScaleX { get; set; }
[XmlAttribute] public float ScaleY { get; set; }
[XmlAttribute] public bool Visible { get; set; }
}
当我使用xsd.exe
为此定义架构时,架构会对其进行设置,以便验证时需要这些属性。
如何设置此课程以便用户可以将这些课程设置为空,因为并非所有课程都是强制性的?
<小时/> 修改的: 我只是看了它生成的xsd并看到了:
<xs:complexType name="AssetBase" abstract="true">
<xs:attribute name="Name" type="xs:string" />
<xs:attribute name="RelativeX" type="xs:float" use="required" />
<xs:attribute name="RelativeY" type="xs:float" use="required" />
<xs:attribute name="RelativeZ" type="xs:float" use="required" />
<xs:attribute name="ScaleX" type="xs:float" use="required" />
<xs:attribute name="ScaleY" type="xs:float" use="required" />
<xs:attribute name="Visible" type="xs:boolean" use="required" />
</xs:complexType>
我很困惑为什么Name不是必需的,但其余的都是......
答案 0 :(得分:2)
正如您发现自己Nullable<T>
并不只是与[XmlAttribute]
合作,因为它是一种复杂的类型。你必须使用魔法&#39; property *指定处理此事。
[XmlIgnore]
public float? RelativeX
{
get { return this.RelativeX; }
set { this.RelativeX = value; }
}
[XmlAttribute("RelativeX")]
public float RelativeXValue
{
get { return this.RelativeX.Value; }
set { this.RelativeX = value; }
}
[XmlIgnore]
public bool RelativeXValueSpecified
{
get { return this.RelativeX.HasValue; }
}
您的其他选择是:
IXmlSerializable
答案 1 :(得分:0)
我找到了这个解释:
使用属性:从类
生成XML模式文档在以下两种情况之一中,Xsd.exe未指定use属性,还原为默认值optional:
•存在遵循指定命名约定的额外公共bool字段。
•通过System.ComponentModel.DefaultValueAttribute类型的属性为成员分配默认值。
如果这些条件都不满足,则Xsd.exe会为use属性生成一个必需值。
我使用默认值方式,它工作正常:)
享受!!!