Недопустимое значение с порожденным классом xsd.exe

Я использую xsd.exe для создания класса для десериализации XML в. У меня есть десятичное значение в источнике xsd, которое не требуется:

<xs:attribute name="Balance" type="xs:decimal" use="optional" />

Полученный класс из xsd генерирует следующий код:

private decimal balanceField;

[System.Xml.Serialization.XmlAttributeAttribute()]
public decimal Balance {
    get {
        return this.balanceField;
    }
    set {
        this.balanceField = value;
    }
}

Которое я замечаю, не имеет значения NULL.

Как я могу сгенерировать поле как nullable, проиллюстрированное следующим образом:

private decimal? balanceField;

[System.Xml.Serialization.XmlAttributeAttribute()]
public decimal? Balance {
    get {
        return this.balanceField;
    }
    set {
        this.balanceField = value;
    }
}

Ответ 1

В настоящее время он работает так, как должен. Я использую xsd v2.0.50727.42 и:

<xs:element name="Port" type="xs:int" nillable="true" />

генерирует именно то, что вы искали (без избыточного поля и свойства ...Specified):

private System.Nullable<int> portField;

[System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
public System.Nullable<int> Port {
    get {
        return this.portField;
    }
    set {
        this.portField = value;
    }
}

Ответ 2

Я считаю, что если вы добавите nillable = "true" в определение вашей XML-схемы, XSD создаст для этого элемента тип с нулевым значением. Это, вероятно, хорошая идея, так как вы подразумеваете, что это значение действительно немыслимо, и это сделает ваше определение схемы более явным в этом отношении.

К сожалению, в этом случае он по-прежнему включает соответствующее поле "Указание". Если вы хотите, чтобы сериализатор напрямую подчинялся нулевому значению, вам нужно вручную удалить столбец "xxSpecified" из сгенерированного кода.

Ответ 3

Я только что заметил, что он действительно включил следующий код:

private bool balanceFieldSpecified;

[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool BalanceSpecified {
    get {
        return this.balanceFieldSpecified;
    }
    set {
        this.balanceFieldSpecified = value;
    }
}

Что обеспечивает функциональность, в которой я нуждаюсь.

Я оставлю вопрос открытым некоторое время, если есть элегантный способ использования nullable? вместо этого.