Обнуляемое значение с сгенерированным классом xsd.exe - PullRequest
11 голосов
/ 14 сентября 2009

Я использовал 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;
    }
}

То, что я отмечаю, не является обнуляемым.

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

private decimal? balanceField;

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

Ответы [ 3 ]

9 голосов
/ 08 марта 2013

В настоящее время работает как надо. Я использую 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;
    }
}
5 голосов
/ 21 июня 2010

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

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

2 голосов
/ 14 сентября 2009

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

private bool balanceFieldSpecified;

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

Который обеспечивает необходимую мне функциональность.

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

...