Недопустимое значение с порожденным классом 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? вместо этого.