Problème de sérialisation avec les classes générées par xsd2code.
Bonjour,
J'utilise xsd2code pour générer le code vb .net à partir d'un fichier xsd.
Xsd2code permet de générer les collections sous différentes formes : array, list, bindinglist, ...
Je préfère les collections de type "list" car plus intuitives à manipuler.
Malheureusement le code généré buggue lors de la sérialisation de la classe.
Le même code généré avec des collections de type "array" fonctionne correctement.
Le plantage ne se produit pas lors de la sérialisation de toutes les "list" mais bien avec certains types de données ... pas facile à expliquer mais plus facile à montrer par l'exemple
Avant d'aller plus loin , le message d'erreur est :
Citation:
Le type d'identificateur de choix 'ItemsElementName' n'est pas cohérent avec le type de 'Items'. Utilisez le tableau de System.Collections.Generic.List
voici le xsd en question :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.home.local/schema/v1" targetNamespace="http://www.home.local/schema/v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.2">
<xsd:element name="bugmessage" type="momentType" />
<xsd:complexType name="textType" mixed="false">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="L" type="xsd:language" use="required" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:simpleType name="date">
<xsd:restriction base="xsd:date">
<xsd:pattern value="((000[1-9])|(00[1-9][0-9])|(0[1-9][0-9]{2})|([1-9][0-9]{3}))-((0[1-9])|(1[012]))-((0[1-9])|([12][0-9])|(3[01]))" />
<xsd:maxInclusive value="9999-12-31" />
<xsd:minInclusive value="1901-01-01" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="time">
<xsd:restriction base="xsd:time">
<xsd:pattern value="(([01][0-9])|(2[0-3]))(:[0-5][0-9]){2}(\.[0-9]+)?" />
<xsd:minInclusive value="00:00:00" />
<xsd:maxInclusive value="23:59:59" />
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="momentType">
<xsd:choice>
<xsd:choice>
<xsd:element name="year" type="xsd:gYear" />
<xsd:element name="yearmonth" type="xsd:gYearMonth" />
</xsd:choice>
<xsd:sequence>
<xsd:element name="date" type="xsd:date" />
<xsd:element name="time" type="xsd:time" minOccurs="0" />
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
</xsd:schema> |
Le bug se produit sur la réflextion xml du type "momentType"
voici le code généré par xsd2code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
Imports System
Imports System.Diagnostics
Imports System.Xml.Serialization
Imports System.Collections
Imports System.Xml.Schema
Imports System.ComponentModel
Imports System.Collections.Generic
Namespace mxsd2code
<System.Diagnostics.DebuggerStepThroughAttribute()> _
Partial Public Class momentType
Private itemsField As List(Of Object)
Private itemsElementNameField As List(Of ItemsChoiceType)
Public Sub New()
MyBase.New()
Me.itemsElementNameField = New List(Of ItemsChoiceType)
Me.itemsField = New List(Of Object)
End Sub
<System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")> _
Public Property Items() As List(Of Object)
Get
Return Me.itemsField
End Get
Set(ByVal value As List(Of Object))
Me.itemsField = Value
End Set
End Property
<System.Xml.Serialization.XmlIgnoreAttribute()> _
Public Property ItemsElementName() As List(Of ItemsChoiceType)
Get
Return Me.itemsElementNameField
End Get
Set(ByVal value As List(Of ItemsChoiceType))
Me.itemsElementNameField = Value
End Set
End Property
End Class
Public Enum ItemsChoiceType
'''<remarks/>
[date]
'''<remarks/>
time
'''<remarks/>
year
'''<remarks/>
yearmonth
End Enum
<System.Diagnostics.DebuggerStepThroughAttribute()> _
Partial Public Class textType
Private lField As String
Private valueField As String
Public Property L() As String
Get
Return Me.lField
End Get
Set(ByVal value As String)
Me.lField = Value
End Set
End Property
<System.Xml.Serialization.XmlTextAttribute()> _
Public Property Value() As String
Get
Return Me.valueField
End Get
Set(ByVal value As String)
Me.valueField = Value
End Set
End Property
End Class
End Namespace |
et voici quelques lignes de code pour faire planter la sérialisation
Code:
1 2 3 4 5 6 7 8 9
|
Dim mt2 As New mxsd2code.momentType
mt2.Items.Add(New Object() {Date.Parse("10/12/1978")})
mt2.ItemsElementName.Add(mxsd2code.ItemsChoiceType.date)
Fich = New System.IO.StreamWriter("c:\momentXType.xml")
XSerial = New XmlSerializer(GetType(mxsd2code.momentType))
XSerial.Serialize(Fich, mt2)
Fich.Close() |
Mis à part un typage différent des données, le code généré en mode collection = array est semblable.
D'avance merci à ceux qui pourront m'aider à comprendre ce qui se passe.