1

在我的代码中,我有以下类来反序列化 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 不是必需的,但其余的是......

4

2 回答 2

2

正如您所发现的那样,您自己Nullable<T>不仅仅使用它,[XmlAttribute]因为它是一种复杂的类型。您必须使用 *Specified 的 'magic' 属性来处理这个问题。

[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
于 2013-09-05T02:33:37.993 回答
0

我找到了这个解释:

使用属性:从类生成 XML Schema 文档

在以下两种情况下,Xsd.exe 不指定 use 属性,恢复为默认值 optional:

• 存在遵循指定命名约定的额外公共布尔字段。

• 默认值通过System.ComponentModel.DefaultValueAttribute 类型的属性分配给成员。

如果这些条件都不满足,Xsd.exe 会为 use 属性生成一个 required 值。

这篇文章

我使用了默认值方式,它工作正常:)

享受 !!!

于 2016-06-08T10:29:07.900 回答