2012-03-08 31 views
27

Kiedy generuję klasę C# ze schematu xsd za pomocą narzędzia xsd.exe, uważam ten behaivor za nieco dziwny.Dlaczego program xsd.exe generuje właściwość string dla xs: integer?

mój żywioł:

<xs:element name="InvoiceNo" type="xs:integer"/> 

generowany jest do:

[System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=5)] 
public string InvoiceNo 
{ 
    ... 
} 

Dlaczego jest to, że nieruchomość nie jest generowany jako int zamiast ciąg?

Odpowiedz

54

To zachowanie jest by design:

typu xs:integer jest określona jako liczba bez górnej i dolnej związany od jego wielkości. Z tego powodu ani serializacja XML, ani walidacja nie mapują go do typu System.Int32. Zamiast XML serializacji odwzorowuje xs:integer do łańcucha podczas walidacji mapuje je do dziesiętny typu, który jest znacznie większy niż którykolwiek z typów całkowitych w Framework

Korzystanie xs:int, który jest podpisał 32-bitową liczbę całkowitą, aby mieć Xsd.exe mapę do System.Int32:

<xs:element name="InvoiceNo" type="xs:int" /> 

Oto detailed list typów danych zdefiniowanych w standardzie definicji schematu XML.

+1

Spot na. Nie wiedziałem o różnicy między xs: int i xs: integer. Myślałem, że to było int i Int32 wC#. – Glenn

+0

Mamy problem teraz, gdy próbujemy wysłać prawidłowe dane do usług TIBCO. Oczywiście, TIBCO się nie zmieni, więc mamy, cudownie. –

+0

Z pewnością powinni używać System.Numerics.BigInteger do tego! – dimaaan